これは、UNIXでのファイルのために非ブロックモードオンにする方法です:UNIXでは
fd = os.open("filename", os.O_CREAT | os.O_WRONLY | os.O_NONBLOCK)
os.write(fd, "data")
os.close(fd)
、しかし、turning on non-blocking mode has no visible effect for regular filesを!ファイルが非ブロックモードであっても、os.write
コールはすぐには戻らず、書き込みが完了するまでスリープします。あなたはos.write
呼び出しは数秒かかりますことに気づくでしょう
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()))
:実験的に自分自身にそれを証明するために、これを試してみてください。コールが非ブロッキング(技術的にはブロックしていない、スリープ状態)であっても、ではなく、非同期です。
AFAIKでは、LinuxまたはWindows上でファイルに非同期で書き込む方法はありません。ただし、スレッドを使用してシミュレーションすることはできます。 Twistedには、この目的のためにdeferToThread
という名前のメソッドがあります。ここでは、それを使用する方法は次のとおりです。
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()
の可能複製(http://stackoverflow.com/questions/319132/asynchronous-file-writing-possible-in-python) – jcollado
[Pythonで可能書き込み非同期ファイル?]いいえ、私は単純なfcntlを使用してそれを保つ必要があります:) – Rahul