2013-11-05 10 views
10

私は、複数のグリーンレットを複数のモジュールにわたって生成するgeventアプリケーションを持っています。私はアプリケーションを正常にシャットダウンすることができます(内部的にも、例えばSIGTERMをキャッチして)。GreenletExitをキャッチし、finally:句を実行することで、グリーンレットをうまく終了させることができます。ゲレンベントでは、始まったすべてのグリーンレットをどうやって殺すことができますか?

もし私がすべてのグリーンレットを実行していれば、私はgevent.killall(list_of_greenlets)をやることができますが、そのようなリストを維持することはむしろ面倒です。そのうえ、geventは何らかの形でこれを非常にリストにしておく必要があります。

だから、リストを維持せずに開始されたすべてのグリーンレットを殺すことはできますか?

(私はraspbian上のpython 2.7にgevent 1.0.0を使用しています)

+0

私たちはあなたのgreenletsの実装の詳細を知る必要があります。あなたはプールを使っていますか?たぶん '' '' gevent.shutdown() ''はあなたのために働くでしょうか? – dorvak

+1

ほとんどのモジュールは単に 'gevent.spawn()'を使うつもりですが、いくつかはプールなどを使っているかもしれません。また、1.0.0には 'gevent.shutdown()'もありません。もし存在していても、メインでないグリーンレットからは実行できず、シグナルハンドラは別のものに終わる可能性が高くなります。 – squirrel

答えて

14

another SO answerによると、それが可能だ「ヒープ上のすべてのオブジェクトを反復処理し、greenletsを検索するために。」だから、これはうまくいくはずです:

import gc 
import gevent 
from greenlet import greenlet  
gevent.killall([obj for obj in gc.get_objects() if isinstance(obj, greenlet)]) 
関連する問題