У меня есть многопоточная программа Python (финансовая торговля), в которой определенные потоки выполняют критические разделы (например, в середине выполнения сделки). Поток, выполняющий критические разделы, является потоком демона. Основной поток программы захватывает SIGINT
и пытается корректно выйти из программы, освобождая все ресурсы, удерживаемые дочерними потоками. Чтобы не допустить, чтобы основной поток внезапно завершал дочерние потоки; основной поток будет перебирать список дочерних объектов потока и вызывать их shutdown()
функцию. Эта функция будет блокироваться до завершения критического участка потока перед возвратом.
Ниже приводится базовая реализация.
class ChildDaemonThread(Thread):
def __init__(self):
self._critical_section = False
# other initialisations
def shutdown(self):
# called by parent thread before calling sys.exit(0)
while True:
if not self._critical_section:
break
# add code to prevent entering critical section
# do resource deallocation
def do_critical_stuff(self):
self._critical_section = True
# do critical stuff
self._critical_section = False
def run(self):
while True:
self._do_critical_stuff()
Я не уверен, будет ли моя реализация работать, потому что, пока ChildDaemonThread
выполняет критическую секцию через do_critical_stuff()
, если родительский поток вызывает дочерний shutdown()
, который блокируется до выполнения критической секции, то в этот момент используются два метода ChildDaemonThread
run()
и do_critical_stuff()
звонили в то же время (я не уверен, законно ли это вообще). Это возможно? Моя реализация верна? Есть ли лучший способ добиться этого?