2012-07-16 18 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

相关问题