2017-07-25 7 views
0

イベントレットgreenthreadsを使用する単純なプログラムを作成していますが、その動作を理解できません。次の例では、スレッドが.wait()メソッドを呼び出すときにのみ実行されるようです。私はドキュメントを読んで、スレッドモジュールが提供する "start"メソッドに似たメソッドを見つけることができません。作成直後にスレッドを強制的に実行させる類似のメソッドはありますか?greenthreadsはスポーンコールの直後に実行されません

Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import eventlet 
>>> def test(): 
...  print("this is a test") 
... 
>>> gth = eventlet.spawn(test) 
>>> 
>>> gth.wait() 
this is a test 
>>> 
+0

ドキュメントは明らかに[spawn() 'について[this](http://eventlet.net/doc/modules/greenthread.html#eventlet.greenthread.GreenThread)と言っています:'実行コントロールは、呼び出し元に直ちに戻ります。作成されたgreenthreadは次の利用可能な機会に実行されるようにスケジューリングされているに過ぎません。 'つまり、コンソールで実行しているため実行されません。代わりに 'wait()'を使わずにスクリプトで実行してください。このスニペットはうまくいくはずです。 –

+0

私はスクリプトで同じことを試みましたが、私は同じ結果を得ました:(.. eventlet.sleep(0)を呼び出すと実行されます – redobot

+0

ああ、私は参照してください。緑色のスレッドは実行する機会があります(そうしないと気をつけますが、そうしなければ、P:緑色のスレッドに関するすべての情報が消えてしまいます)。それ以外に、他の選択肢はありません。 –

答えて

1

TL; DR:eventlet.sleep()が必要です。有用なもの、通常はネットワークが必要です。

この合成試験では、観察された挙動が予想されます。生産コードは、他のグレースドッグを実行するための過度の機会を提供します。言い換えれば、実際には実際のコードのOSスレッドと同様に動作します。

イベントレットはcooperative multitaskingです。すべてのスレッドは他のスレッドに制御権を与え、他のスレッドに実行可能にします。イベント・レットは、システム・ライブラリーにパッチを適用して、通常はブロックするときに生成されます

さらに詳しい説明はhttps://stackoverflow.com/a/14227272/73957を参照してください。

関連する問題