3

このコードは何も出力しません:

def foo(i):
    print i

def main():
    pool = eventlet.GreenPool(size=100)
    for i in xrange(100):
        pool.spawn_n(foo, i)
    while True:
        pass

しかし、このコードは数字を出力します:

def foo(i):
    print i

def main():
    pool = eventlet.GreenPool(size=100)
    for i in xrange(100):
        pool.spawn_n(foo, i)
    pool.waitall()
    while True:
        pass

唯一の違いはpool.waitall(). 私の考えでwaitall()は、プール内のすべてのグリーンスレッドが機能し終わるまで待機することを意味しますが、無限ループはすべてのグリーンスレッドを待機するため、pool.waitall()必要ありません。

では、なぜこれが起こるのですか?

参照: http://eventlet.net/doc/modules/greenpool.html#eventlet.greenpool.GreenPool.waitall

4

1 に答える 1

5

イベントレットで作成されたスレッドGreenPoolは、緑色のスレッドです。これは、それらがすべてオペレーティング システム レベルで 1 つのスレッド内に存在し、Python インタープリターがそれらの間の切り替えを処理することを意味します。この切り替えは、1 つのスレッドが譲歩する(意図的に他のスレッドが実行される機会を提供する) か、I/O を待機している場合にのみ発生します。

コードの実行時:

while True:
    pass

… その実行スレッドはブロックされ、そのコードでスタックし、他のグリーン スレッドはスケジュールされません。

代わりに実行すると:

pool.waitall()

… eventlet は、待機中に確実に降伏するようにします。

whileループを少し変更してeventlet.sleep関数を呼び出すことで、これと同じ動作をエミュレートできます。

while True:
    eventlet.sleep()

while True:これは、プール内のスレッドが完了するのを待っている間にループ内で何か他のことをしたい場合に便利です。それ以外の場合は、そのまま使用pool.waitall()してください。それが目的です。

于 2016-01-02T09:01:55.280 に答える