Python gevent No veo a Monkey parcheado el archivo predeterminado abrir / leer / escribir / cerrar, cómo hacer io de archivo en gevent async

En el parche de gevent monkey, no vi nada sobre el funcionamiento del objeto de archivo predeterminado. ¿Cómo puedo usar la lectura / escritura de archivos asíncronos en progtwigs basados ​​en gevent?

Puede usar la clase fileobject.FileObjectThreadPool de gevent disponible en 1.0b3:

pip install http://gevent.googlecode.com/files/gevent-1.0b3.tar.gz#egg=gevent 

Entonces tu ejemplo se convertiría en:

 #!/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 ) 

Veo el siguiente resultado con ese código:

 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 ... 

Acabo de hacer una prueba, dice que escribir un archivo grande bloqueará el bucle de eventos

 #!/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 ) 

el resultado es este:

 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 

Puedes usar un threadpool (comenzando con gevent 1.0 ):

 >>> import gevent.threadpool >>> pool = gevent.threadpool.ThreadPool(5) >>> pool.apply(w)