在gevent猴子补丁中,我没有看到任何关于默认文件对象的操作。 如何在基于gevent的程序中使用异步文件读/写?Python gevent我没有看到猴子打开默认文件打开/读取/写入/关闭,如何使文件io gevent异步
回答
只是做了一个测试,说,写一个大文件将阻止事件循环
#!/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
你可以使用一个线程池(从GEVENT 1.0) :
>>> import gevent.threadpool
>>> pool = gevent.threadpool.ThreadPool(5)
>>> pool.apply(w)
是的,我可以使用threadpool。但是我的问题不是关注gevent的用法。我想找到一种方法来在Windows和Linux中执行异步文件io。当然用Python语言,并与gevent一起工作。 – 2012-07-16 08:48:27
您可以使用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
...
道歉 - 根据你使用的操作系统,这可能不适合你。我刚刚提出了一个关于这个不适用于Ubuntu 12.04的bug:https://code.google.com/p/gevent/issues/detail?id=150。 gevent家伙很善于修复错误,尽管它可能很快适用于所有平台。 – mrkhingston 2012-08-15 06:38:56
仅供参考,丹尼斯现在已在gevent的HEAD中修复了第150期,即将作为gevent-1.0b4发布。但是,我原来的使用FileObject的说明是错误的 - 我编辑了我的答案以使用FileObjectThreadPool。 – mrkhingston 2012-08-31 00:26:47
请注意Denis最近[更改](https://github.com/surfly/gevent/commit/184bc92992dde92477be277a4860ecde4065ee4d)将'FileObjectThreadPool'的名称改为'FileObjectThread' – 2013-04-03 16:42:36
- 1. 没有加速读取文件与gevent
- 2. 如何使用py2exe将python + gevent程序打包成.exe文件?
- 3. 如何使用gevent编写文件
- 4. 的Java如何创建,打开,写入和读取,然后关闭该文件
- 5. Xamarin iOS:如何使用默认阅读器打开.pdf文件?
- 6. 文件打开和关闭在Python
- 7. 打开读取和写入的文件可以取消关联
- 8. 没有关闭Python中的打开文件有什么后果?
- 9. 如何关闭打开的文件?
- 10. 如何在写入中打开文件,关闭它,然后在读取中重新打开它?
- 11. 我在打开Python文件:(
- 12. 如何在Windows中使用Python打开文件后关闭cmd?
- 13. 打开并写入文件
- 14. 打开和读取文件
- 15. python- os.system()没有正确打开,然后立即关闭文件
- 16. 打开excel文件并写入python
- 17. IOError:文件未打开写入 - Python
- 18. python读取文件打开LED
- 19. Python:无法打开和读取文件
- 20. 使用C关闭打开的文件
- 21. 如何更改Python写入/打开CSV文件的默认位置?
- 22. 在内联“打开和写入文件”是关闭()隐式?
- 23. 打开原子,没有打开任何文件
- 24. java如何打开文件写入
- 25. 如何打开和读取文件
- 26. 在写入文件后打开文件
- 27. Python:多次写入文件,无需每次写入都打开/关闭
- 28. 使用Java打开或关闭打开的Windows文件
- 29. 使用Python使用默认应用程序打开文件,然后在文件打开后打印?
- 30. 显式开关()与gevent
不是问题-the“乜这部分有你试过“的位,而不是答案? – 2014-05-23 06:34:06