在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. 的Java如何創建,打開,寫入和讀取,然後關閉該文件
- 3. Xamarin iOS:如何使用默認閱讀器打開.pdf文件?
- 4. 如何在寫入中打開文件,關閉它,然後在讀取中重新打開它?
- 5. 我在打開Python文件:(
- 6. 如何在Windows中使用Python打開文件後關閉cmd?
- 7. 打開並寫入文件
- 8. python- os.system()沒有正確打開,然後立即關閉文件
- 9. Python:無法打開和讀取文件
- 10. 使用C關閉打開的文件
- 11. 如何更改Python寫入/打開CSV文件的默認位置?
- 12. 在內聯「打開和寫入文件」是關閉()隱式?
- 13. 顯式開關()與gevent
- 14. 打開原子,沒有打開任何文件
- 15. Python:多次寫入文件,無需每次寫入都打開/關閉
- 16. 使用Java打開或關閉打開的Windows文件
- 17. Visual Studio默認打開文件操作
- 18. 如何用默認關聯程序打開文件
- 19. ifstream_class.open沒有打開文件
- 20. .mat文件沒有打開
- 21. 文件沒有打開
- 22. 如何更改默認程序帽子打開文件
- 23. 如何打開並讀取文件並將特定內容寫入新文件?
- 24. Java多重打開和關閉寫入文件
- 25. 如何使用Python寫入打開的Excel文件?
- 26. 異步寫入和讀取文件
- 27. jquery文件樹 - 默認打開所有文件夾?
- 28. 如何在打開新文件時打開文件(打開文件)?
- 29. 當我打開/關閉解決方案時,如何防止Visual Studio 2008關閉所有打開的文件?
- 30. gevent猴子補丁和斷點
不是問題-the「乜這部分有你試過「的位,而不是答案? – 2014-05-23 06:34:06