2016-11-11 2 views
2

У меня есть установка сервера GCE для обработки некоторого анализа данных. Я могу связаться с ним через ws, используя twisted. Я единственный клиент этого сервера.Закрутить скрученный реактор на сигнете

Система настроена так:

spawn_multiprocessing_hierarchy() 
reactor.run() # Blocks main thread 
stop_everything_and_cleanup() 

Когда я пытаюсь остановить систему и клиент подключен, reactor будет игнорировать (? Или отложить на неопределенный срок, может быть) SIGTERM, потому что обрабатывает подключение клиента. Тем не менее, каждая другая часть системы отказоустойчива и reactorникогда ручки любой критические данные. Он существует исключительно для целей мониторинга. Это означает, что я мог бы легко получить SIGKILL, если бы он не для других multiprocess.Process es, которые должны были сбрасывать данные в памяти, чтобы они могли продолжить, где они остановились последним при следующем запуске.

Возможно ли сразу получить SIGTERM (не дожидаясь выполнения заданий в реакторе до конца) отказаться от любых соединений и остановить реактор?

ответ

0

Не видя остальной части вашего кода, сложно предположить, что такое точная проблема. Как правило, когда реактор не останавливается, это происходит потому, что задача выполняется в потоке или процессе. Twisted попытается сделать «правильную вещь» и будет ждать завершения всех потоков/процессов до выхода. Вы можете добавить событие, когда реактор остановлен через reactor.addSystemEventTrigger.

+0

Я знаю, что мой реактор не останавливается, потому что задача запущена. Учитывая, что только один клиент когда-либо подключается к серверу, я в порядке с тем, что у реактора выполняется очень длинная задача, потому что мне нужен только один одновременный запуск на сервере. Я хотел бы заставить реактор сбросить любую задачу, потому что это никогда не критически важно, и это задерживает выход системы, когда требуется. – Mirac7

+0

Одним из способов этого не является процесс нереста через Twisted (т.е. '' reactor.spawnProcess'', '' task.deferToThread'', '' threads.callInThread'' и т. Д.), Скорее управлять объектом процесса вручную и устанавливать ' 'daemon = True''. Таким образом, Twisted не заботится об этих потоках/процессах, и они просто «умирают», когда ваше приложение останавливается. –

Смежные вопросы