2013-11-05 4 views
10

Ho un'applicazione gevent che genera più greenlet su più moduli. Voglio essere in grado di arrestare con garbo l'applicazione (internamente o catturando SIGTERM, per esempio), permettendo ai greenlet di terminare in modo soddisfacente catturando GreenletExit ed eseguendo clausole finally:.In un'applicazione gevent, come posso uccidere tutti i greenlet che sono stati avviati?

Se avessi uno di tutti i greenlet in esecuzione, potrei fare gevent.killall(list_of_greenlets), ma mantenere tale elenco è piuttosto una seccatura; inoltre, gevent deve mantenere questa lista in un modo o nell'altro.

Quindi, posso uccidere tutti i greenlet che sono stati avviati senza mantenere un elenco di essi?

(sto usando gevent 1.0.0 su Python 2.7 su raspbian)

+0

Abbiamo bisogno di maggiori dettagli sulla tua implementazione di greenlet. Stai usando una piscina, per esempio? Forse '' 'gevent.shutdown()' '' funziona per te? – dorvak

+1

La maggior parte dei moduli useranno semplicemente 'gevent.spawn()', ma alcuni potrebbero usare un pool o qualunque cosa vogliano. Inoltre, non c'è 'gevent.shutdown()' in 1.0.0, e anche se ci fosse, non può essere eseguito da una greenlet non principale, e il gestore di segnale è più che probabile che finisca in uno diverso. – squirrel

risposta

14

Secondo another SO answer, è possibile "per scorrere tutti gli oggetti sul mucchio e cercare greenlets." Quindi, immagino che dovrebbe funzionare:

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