2012-02-08 57 views
18

我使用gevent,我是猴子修補所有東西。
看起來像猴子修補會導致線程串行工作。使用gevent monkey線程修補線程使線程連續工作

我的代碼:

import threading 
from gevent import monkey; monkey.patch_all() 

class ExampleThread(threading.Thread): 
    def run(self): 
     do_stuff() # takes a few minutes to finish 
     print 'finished working' 

if __name__ == '__main__': 
    worker = ExampleThread() 
    worker.start() 
    print 'this should be printed before the worker finished' 

所以預期線程是行不通的。
但如果我刪除monkey.patch_all()它工作正常。
的問題是,我需要monkey.patch_all()使用GEVENT(現在上面的代碼示出)

我的解決辦法:

我改變了

monkey.patch_all() 

monkey.patch_all(thread=False) 

所以我不修補該線程。

回答

20

當線程在gevent中被修補時,它們表現爲協程。這意味着你必須明確地產生控制權才能使其他協程執行。

做到這一點的方法是調用已修補阻塞操作(這將自動產生)或gevent.sleep

#!/usr/bin/env python 
from gevent import monkey, sleep 
monkey.patch_all() 
import threading 

class ExampleThread(threading.Thread): 
    def run(self): 
     for i in xrange(10): 
      print 'working' 
      sleep() 

if __name__ == '__main__': 
    worker = ExampleThread() 
    worker.start() 
    print 'this will be printed after the first call to sleep' 
+0

我已經編輯我的問題。我無法使用睡眠,因爲我的工作需要幾分鐘時間, – yossi 2012-02-08 12:09:13

+3

@yossi如果你有一項任務需要很長時間才能完成,並且無法在某個時間點產生控制權,那麼你需要真正的線程而不是協程。在這種情況下,我會說你最好不要補丁線程。 – jcollado 2012-02-08 12:18:26

+0

好吧,我做的是monkey.patch_all(thread = False) – yossi 2012-02-08 14:24:08