2013-03-01 68 views
2

代碼:爲什麼gevent執行這個未連接的greenlet?

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,因此,我希望它永遠不會執行;或者,由於長時間的睡眠(),它應該在第二個greenlet之後完成。

語境:

我希望能夠把火關「暴殄天物」 greenlet用於填充緩存,我從來沒有參加上,我從來沒有想阻止等待的結果。

回答

4

這是因爲time.sleep()不是GEVENT感知,所以當join()被調用時,執行流程將是:

  1. gevent.spawn(a) - 按下「催生一個」運行到事件隊列
  2. gevent.spawn(b) - 將事件隊列中的「spawn b」操作推入
  3. .join() - 導致主線程退出並執行事件隊列中的下一個事件(在此例中爲a
  4. a執行time.sleep(4),阻斷整個過程持續4秒(但線程a不會產生因爲time.sleep()不GEVENT感知)
  5. a終止,並執行在事件隊列中的下一個事件(在這種情況下,b
  6. b執行和終止,執行隊列中的下一個事件(在這種情況下,跳躍回主線程,導致.join()返回)

二者必選其一gevent.monkeygevent.sleep()看到這PERFO正如你所期望的那樣。

+0

爲什麼如果我從不加入它,它會執行嗎? – 2013-03-01 18:12:49

+0

我已經更新了我的回答,澄清了幕後發生了什麼......這有幫助嗎? – 2013-03-01 20:42:14

+0

所以gevent有一個全局事件隊列,並且調用單個greenlet上的join()實際上啓動隊列中的所有事情? – 2013-03-01 23:53:13