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)
Abbiamo bisogno di maggiori dettagli sulla tua implementazione di greenlet. Stai usando una piscina, per esempio? Forse '' 'gevent.shutdown()' '' funziona per te? – dorvak
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