2017-07-25 34 views
0

我正在創建一個使用eventlet greenthreads的簡單程序,我無法理解它們的行爲。從下面的例子看來,線程只在我調用.wait()方法時運行。我閱讀文檔,找不到類似於線程模塊提供的「啓動」方法的任何方法。有沒有類似的方法來強制線程在創建之後運行(spawn call)?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

時才運行啊,我明白了,如果你自己運行它,主進程會退出綠線有機會跑(如果你這樣做,該死的,如果你不這樣做,該死的):因此所有關於綠線的信息都會消失,你可以讓主線睡覺,這就是你所做的。除此之外,你沒有任何其他選擇 –

回答

1

TL; DR:您需要eventlet.sleep()或等待一些有用的東西,通常是網絡。

此合成測試預計會觀察到的行爲。生產代碼爲運行其他綠色線程提供了過多的機會。換句話說:它實際上與實際代碼爲的操作系統線程類似。

Eventlet提供cooperative multitasking。每個線程都可以控制其他線程,讓其他線程有機會運行。 Eventlet可以在系統庫通常阻塞時修補系統庫。

有關更詳細的解釋,請參閱https://stackoverflow.com/a/14227272/73957