3

コード:

import gevent
import time

def func(a, t):
  time.sleep(t)
  print "got here", a

gevent.spawn(func, 'a', 4)
gevent.spawn(func, 'b', 0).join()
time.sleep(3)
print "exit"

出力:

got here a
got here b
exit

期待:

私は最初の greenlet に参加したことがないので、実行されることはないと予想しています。または、長い sleep() を指定すると、2 番目の greenlet の後に完了する必要があります。

環境:

私は決して参加したことがなく、結果を待つためにブロックしたくないキャッシュを作成する「使い捨て」グリーンレットを発射できるようにしたいと考えています。

4

1 に答える 1

5

これはtime.sleep()gevent に対応していないため、join()が呼び出されたときの実行フローは次のようになります。

  1. gevent.spawn(a)— 「spawn a」操作をイベント キューにプッシュします。
  2. gevent.spawn(b)— 「spawn b」操作をイベント キューにプッシュします。
  3. .join()— メイン スレッドが生成され、イベント キュー内の次のイベントが実行されます (この場合はa) 。
  4. aを実行しtime.sleep(4)、プロセス全体を 4 秒間ブロックします (ただし、gevent に対応してaいないため、スレッドは生成されません)。time.sleep()
  5. aが終了し、イベント キュー内の次のイベントが実行されます (この場合はb) 。
  6. b実行して終了し、キューの次のイベントが実行されます (この場合、メイン スレッドにジャンプし.join()て戻ります) 。

gevent.monkeyまたはを使用gevent.sleep()して、これが期待どおりに実行されることを確認します。

于 2013-03-01T17:58:52.790 に答える