Как в приложении 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)]
)