Esta es la forma en que encienda la no-bloqueo sobre un archivo en UNIX:
fd = os.open("filename", os.O_CREAT | os.O_WRONLY | os.O_NONBLOCK)
os.write(fd, "data")
os.close(fd)
En UNIX, sin embargo, turning on non-blocking mode has no visible effect for regular files! Aunque el archivo esté en modo no bloqueante, la llamada os.write
no se devolverá de inmediato, permanecerá inactiva hasta que se complete la escritura. Para demostrar a sí mismo de forma experimental, intente esto:
import os
import datetime
data = "\n".join("testing\n" * 10 for x in xrange(10000000))
print("Size of data is %d bytes" % len(data))
print("open at %s" % str(datetime.datetime.now()))
fd = os.open("filename", os.O_CREAT | os.O_WRONLY | os.O_NONBLOCK)
print("write at %s" % str(datetime.datetime.now()))
os.write(fd, data)
print("close at %s" % str(datetime.datetime.now()))
os.close(fd)
print("end at %s" % str(datetime.datetime.now()))
Se dará cuenta de que la llamada os.write
embargo, toma varios segundos. Aunque la llamada no sea de bloqueo (técnicamente, no está bloqueando, está durmiendo), la llamada es no asíncrona.
AFAIK, no hay forma de escribir en un archivo de forma asincrónica en Linux o en Windows. Puede simularlo, sin embargo, usando hilos. Twisted tiene un método llamado deferToThread
para este propósito. He aquí cómo lo usa:
from twisted.internet import threads, reactor
data = "\n".join("testing\n" * 10 for x in xrange(10000000))
print("Size of data is %d bytes" % len(data))
def blocking_write():
print("Starting blocking_write")
f = open("testing", "w")
f.write(data)
f.close()
print("End of blocking_write")
def test_callback():
print("Running test_callback, just for kicks")
d = threads.deferToThread(blocking_code)
reactor.callWhenRunning(cc)
reactor.run()
posible duplicado de (http://stackoverflow.com/questions/319132/asynchronous-file-writing-possible-in-python) – jcollado
[archivo de escritura asíncrona posible en Python?] No, no es así, necesito mantenerlo simple simplemente usando fcntl :) – Rahul