gevent モンキー パッチでは、デフォルト ファイル オブジェクトの操作について何も表示されませんでした。gevent ベースのプログラムで非同期ファイルの読み取り/書き込みを使用するにはどうすればよいですか?
質問する
3943 次
3 に答える
4
1.0b3 で利用可能な gevent の fileobject.FileObjectThreadPool クラスを使用できます。
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
...
于 2012-08-13T03:10:54.643 に答える
1
テストを行ったところ、大きなファイルを書き込むとイベントループがブロックされると言われています
#!/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
于 2012-07-16T01:53:56.333 に答える
0
スレッドプールを使用できます ( gevent 1.0以降):
>>> import gevent.threadpool
>>> pool = gevent.threadpool.ThreadPool(5)
>>> pool.apply(w)
于 2012-07-16T05:24:56.653 に答える