在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