Правильное обращение с детскими гринлетами
Я создаю задачи, наследуя от Greenlet
, У меня есть одна родительская задача, которая вызывает start()
на двоих детей в своем _run()
, В другом месте (это сервис systemd) start()
а также join()
называются.
Поведение кажется правильным. Например, использование Queue
с таймаутами достигает желаемого эффекта, но я не нашел хорошего способа отключить детей, скажем KeyboardInterrupt
или путем регистрации обратного вызова родительской задачи для SIGTERM
, В обработчике я бы назвал child1.kill()
и 'child2.kill ()but only the first called seemed to raise
GreenletExit`.
Я никогда не звоню join()
на детей, и я не уверен, как бы я сделал это правильно. Я неправильно использую библиотеку?
1 ответ
Моя ошибка заключалась в том, что я занимался gevent.greenlet.GreenletExit
у ребенка задачи. Если вам нужно обработать выход, вы можете перехватить и восстановить это исключение.