2016-01-02 34 views
2

此代碼打印什麼:爲什麼沒有eventlet GreenPool在spawn_n之後調用func除非waitall()?

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

回答

3

在eventlet GreenPool創建的線程是綠色線程。這意味着它們都存在於操作系統級別的一個線程中,Python解釋器處理它們之間的切換。只有當一個線程產生(有意提供其他線程運行的機會)或正在等待I/O時纔會發生此切換。

當你的代碼運行:

while True: 
    pass 

...執行線程是阻塞 - 卡上的代碼 - 並沒有其他綠色線程能獲得計劃。

當你去運行:

pool.waitall() 

... eventlet確保它產生在等待。

你可以通過稍微修改您的while循環調用eventlet.sleep功能,這將產生模擬此相同的行爲:

while True: 
    eventlet.sleep() 

,如果你想做些別的事情在while True:循環,同時等待這可能是有用的線程在您的池中完成。否則,只需使用pool.waitall() - 這就是它的用途。

相關問題