2013-11-05 2 views
10

Ich habe eine Gevent-Anwendung, die mehrere Greenlets über mehrere Module erzeugt. Ich möchte in der Lage sein, die Anwendung ordnungsgemäß herunterzufahren (entweder intern oder durch Abfangen von SIGTERM zum Beispiel), was ermöglicht, dass Gree-lets gut ablaufen, indem sie GreenletExit abfangen und finally:-Klauseln ausführen.Wie kann ich in einer Gevent-Anwendung alle Greenlets beenden, die gestartet wurden?

Wenn ich die a aller laufenden Greenlets hätte, könnte ich tun gevent.killall(list_of_greenlets), aber die Pflege einer solchen Liste ist eher ein Ärger; Außerdem muss gevent diese Liste in irgendeiner Form halten.

Kann ich also alle Greenlets beenden, die gestartet wurden, ohne eine Liste von ihnen zu führen?

(Ich verwende GEVENT 1.0.0 auf Python 2.7 auf raspbian)

+0

Wir brauchen weitere Details Ihrer Implementierung von Greenlets. Verwenden Sie einen Pool, zB? Vielleicht funktioniert 'gevent.shutdown()' '' für Sie? – dorvak

+1

Die meisten Module verwenden einfach 'gevent.spawn()', aber einige verwenden einen Pool oder was immer sie wollen. Außerdem gibt es kein 'gevent.shutdown()' in 1.0.0, und selbst wenn es solche gibt, kann es nicht von einem Nicht-Haupt-Greenlet ausgeführt werden, und Signalhandler wird mehr als wahrscheinlich in einem anderen enden. – squirrel

Antwort

14

Nach another SO answer, ist es möglich, „alle Objekte auf dem Heap zu durchlaufen und für greenlets suchen.“ Also, ich stelle mir vor, das sollte funktionieren:

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