Как в приложении gevent убить все запущенные гринлеты?
У меня есть приложение gevent, которое порождает несколько зеленых на нескольких модулях. Я хочу иметь возможность изящно закрыть приложение (например, внутренне или путем ловли SIGTERM
, например), позволяя зеленым красиво прекратить работу, ловив GreenletExit
и выполняя предложения finally:
.
Если бы у меня была a из всех запущенных особей, я мог бы сделать gevent.killall(list_of_greenlets)
, но сохранение такого списка - скорее хлопот; кроме того, gevent должен хранить этот самый список в той или иной форме.
Итак, могу ли я убить все запущенные зелья, не сохранив их список?
(Я использую gevent 1.0.0 на python 2.7 на raspbian)
Ответы
Ответ 1
В соответствии с другим SO-ответом возможно "перебирать все объекты в куче и искать зеленые". Поэтому я полагаю, что это должно работать:
import gc
import gevent
from greenlet import greenlet
gevent.killall([obj for obj in gc.get_objects() if isinstance(obj, greenlet)])
Ответ 2
Это не совсем работало для версий gevent (1.2.2) и greenlet (0.4.13), которые я использовал, но следующее работает:
import gc
import gevent
gevent.killall(
[obj for obj in gc.get_objects() if isinstance(obj, gevent.Greenlet)]
)