2012-07-16 45 views

回答

0

只是做了一個測試,說,寫一個大文件將阻止事件循環

#!/usr/bin/env python 
import gevent 
import datetime 


def hi(): 
    while True: 
     print datetime.datetime.now(), "Hello" 
     gevent.sleep(1) 

def w(): 
    print "writing..." 
    s = "*"*(1024*1024*1024) 
    f = open("e:/a.txt", "wb") 
    f.write(s) 
    f.close() 

t1 = gevent.spawn(hi) 
t2 = gevent.spawn(w) 
ts = [t1,t2] 
gevent.joinall(ts) 

的結果是這樣的:

e:\zPython\zTest>gevent.write.large.file.py 
writing... # wait a long time here 
write done. 
2012-07-16 09:53:23.784000 Hello 
2012-07-16 09:53:24.786000 Hello 
2012-07-16 09:53:25.788000 Hello 
+1

不是問題-the「乜這部分有你試過「的位,而不是答案? – 2014-05-23 06:34:06

0

你可以使用一個線程池(從GEVENT 1.0) :

>>> import gevent.threadpool 
>>> pool = gevent.threadpool.ThreadPool(5) 
>>> pool.apply(w) 
+0

是的,我可以使用threadpool。但是我的問題不是關注gevent的用法。我想找到一種方法來在Windows和Linux中執行異步文件io。當然用Python語言,並與gevent一起工作。 – 2012-07-16 08:48:27

4

您可以使用gevent的fileobject.FileObjectThreadPool類,可用於1.0 B3:

pip install http://gevent.googlecode.com/files/gevent-1.0b3.tar.gz#egg=gevent 

然後你的榜樣將成爲:

#!/usr/bin/env python 
import gevent 
from gevent.fileobject import FileObjectThreadPool 
import datetime 


def hi(): 
    while True: 
     print datetime.datetime.now(), "Hello" 
     gevent.sleep(1) 

def w(): 
    print "writing..." 
    s = "*"*(1024*1024*1024) 
    print 'about to open' 
    f_raw = open("./a.txt", "wb") 
    f = FileObjectThreadPool(f_raw, 'wb') 
    f.write(s) 
    f.close() 
    print 'write done' 

t1 = gevent.spawn(hi) 
t2 = gevent.spawn(w) 
ts = [t1,t2] 
gevent.joinall(ts) 

我看到這些代碼的輸出如下:

writing... 
about to open 
2012-08-13 13:00:27.876202 Hello 
2012-08-13 13:00:28.881119 Hello 
2012-08-13 13:00:29.959642 Hello 
... 
2012-08-13 13:00:58.010001 Hello 
2012-08-13 13:00:59.010146 Hello  
2012-08-13 13:01:00.010248 Hello 
write done 
2012-08-13 13:01:01.469547 Hello 
... 
+0

道歉 - 根據你使用的操作系統,這可能不適合你。我剛剛提出了一個關於這個不適用於Ubuntu 12.04的bug:https://code.google.com/p/gevent/issues/detail?id=150。 gevent傢伙很善於修復錯誤,儘管它可能很快適用於所有平臺。 – mrkhingston 2012-08-15 06:38:56

+0

僅供參考,丹尼斯現在已在gevent的HEAD中修復了第150期,即將作爲gevent-1.0b4發佈。但是,我原來的使用FileObject的說明是錯誤的 - 我編輯了我的答案以使用FileObjectThreadPool。 – mrkhingston 2012-08-31 00:26:47

+1

請注意Denis最近[更改](https://github.com/surfly/gevent/commit/184bc92992dde92477be277a4860ecde4065ee4d)將'FileObjectThreadPool'的名稱改爲'FileObjectThread' – 2013-04-03 16:42:36

相關問題