2013-11-05 11 views
10

Mam aplikację gevent, która spawnuje wiele greenletów w wielu modułach. Chcę być w stanie z wdziękiem zamknąć aplikację (wewnętrznie lub przez złapanie na przykład SIGTERM), pozwalając, aby greenlety ładnie się zakończyły, łowiąc GreenletExit i wykonując klauzule finally:.W geenie, w jaki sposób mogę zabić wszystkie uruchomione greenlety?

Gdybym miał jeden z wszystkich działających greenletów, mógłbym zrobić gevent.killall(list_of_greenlets), ale utrzymanie takiej listy jest raczej kłopotliwe; poza tym, gevent musi zachować tę listę w takiej czy innej formie.

Czy mogę zabić wszystkie zielone warzywa, które zostały uruchomione bez prowadzenia ich listy?

(używam gevent 1.0.0 na Pythona 2.7 raspbian)

+0

Potrzebujemy więcej szczegółów na temat wdrażania zielonych produktów. Czy korzystasz z puli, f.e.? Może '' 'gevent.shutdown()' '' działa dla ciebie? – dorvak

+1

Większość modułów będzie używać po prostu 'gevent.spawn()', ale niektóre mogą używać puli lub cokolwiek innego. Ponadto, nie ma "gevent.shutdown()" w wersji 1.0.0, a nawet gdyby istniało, nie można go uruchomić z innej niż główna greenletu, a obsługa sygnału jest bardziej niż prawdopodobne, że skończy się na innej. – squirrel

Odpowiedz

14

Według another SO answer, jest to możliwe "iterację wszystkich obiektów na stercie i szukać greenlets". Tak więc, wyobrażam sobie, że to powinno zadziałać:

import gc 
import gevent 
from greenlet import greenlet  
gevent.killall([obj for obj in gc.get_objects() if isinstance(obj, greenlet)]) 
Powiązane problemy