У меня есть установка сервера GCE для обработки некоторого анализа данных. Я могу связаться с ним через ws
, используя twisted
. Я единственный клиент этого сервера.Закрутить скрученный реактор на сигнете
Система настроена так:
spawn_multiprocessing_hierarchy()
reactor.run() # Blocks main thread
stop_everything_and_cleanup()
Когда я пытаюсь остановить систему и клиент подключен, reactor
будет игнорировать (? Или отложить на неопределенный срок, может быть) SIGTERM
, потому что обрабатывает подключение клиента. Тем не менее, каждая другая часть системы отказоустойчива и reactor
никогда ручки любой критические данные. Он существует исключительно для целей мониторинга. Это означает, что я мог бы легко получить SIGKILL
, если бы он не для других multiprocess.Process
es, которые должны были сбрасывать данные в памяти, чтобы они могли продолжить, где они остановились последним при следующем запуске.
Возможно ли сразу получить SIGTERM
(не дожидаясь выполнения заданий в реакторе до конца) отказаться от любых соединений и остановить реактор?
Я знаю, что мой реактор не останавливается, потому что задача запущена. Учитывая, что только один клиент когда-либо подключается к серверу, я в порядке с тем, что у реактора выполняется очень длинная задача, потому что мне нужен только один одновременный запуск на сервере. Я хотел бы заставить реактор сбросить любую задачу, потому что это никогда не критически важно, и это задерживает выход системы, когда требуется. – Mirac7
Одним из способов этого не является процесс нереста через Twisted (т.е. '' reactor.spawnProcess'', '' task.deferToThread'', '' threads.callInThread'' и т. Д.), Скорее управлять объектом процесса вручную и устанавливать ' 'daemon = True''. Таким образом, Twisted не заботится об этих потоках/процессах, и они просто «умирают», когда ваше приложение останавливается. –