2012-10-29 49 views
0
import threading,gevent,gevent.monkey 
class test(threading.Thread): 
    def __init__(self): 
    threading.Thread.__init__(self) 
    def run(self): 
    print 1 
    gevent.sleep(2) 
    print 2 
gevent.monkey.patch_thread() 
t=test() 
t.start() 

爲什麼'print 2'不能運行,該怎麼辦?gevent的python線程?

如果要下載文件,多線程和gevent,哪個更快?

回答

0

爲什麼你嘗試使用gevent裏面的thread類繼承? 工作示例:

>>> import threading, gevent, gevent.monkey 
>>> gevent.monkey.patch_thread() 
>>> def run(self): 
...  print 1 
...  gevent.sleep(2) 
...  print 2 
... 
>>> gevent.joinall([gevent.spawn(run, [])]) 
1 
2 
>>> 
2

這是一個有效的問題。

這是因爲在gevent中,只要主greenlet退出,程序就會退出。使用線程,Python會等待所有線程完成。

有兩個選項有:

  1. 在腳本的末尾添加t.join()。這將等待t完成。您需要爲所有非後臺線程執行此操作。
  2. 在腳本結尾添加gevent.wait()。這將等待事件循環退出 - 這意味着所有greenlet和線程。

請注意,gevent.wait()僅適用於1.0(download 1.0rc here)。 join適用於所有版本。