Pythonで非同期にファイルに書き込む簡単な方法はありますか?
Pythonに付属しているファイルioがブロックしていることは知っています。ほとんどの場合、これで問題ありません。この特定のケースでは、アプリケーションをまったくブロックしないように、または少なくとも可能な限り最小限に抑えるために、書き込みが必要です。
Pythonで非同期にファイルに書き込む簡単な方法はありますか?
Pythonに付属しているファイルioがブロックしていることは知っています。ほとんどの場合、これで問題ありません。この特定のケースでは、アプリケーションをまったくブロックしないように、または少なくとも可能な限り最小限に抑えるために、書き込みが必要です。
私が理解しているように、非同期 I/O は非ブロッキング I/O とまったく同じではありません。
ノンブロッキング I/O の場合、ファイル記述子が「ノンブロッキング」に設定されると、read()
(たとえば) システム コールはEWOULDBLOCK
(またはEAGAIN
) 読み取り操作が完了のために呼び出しプロセスをブロックする場合に戻ります。操作。select()
、poll()
、などのシステム コールepoll()
が提供されているため、プロセスは、1 つまたは複数のファイル記述子がI/O 操作の実行に使用可能になったときに OS に通知するように要求できます。
非同期 I/O は、ファイル記述子への I/O 要求をキューに入れることによって動作し、呼び出しプロセスとは別に追跡されます。非同期 I/O (通常は raw ディスク デバイス) をサポートするファイル記述子の場合、プロセスはaio_read()
(たとえば) ファイル記述子から読み取るバイト数を要求するために呼び出すことができます。I/O が完了したかどうかに関係なく、システム コールはすぐに戻ります。しばらくして、プロセスはオペレーティング システムをポーリングし、I/O の完了(つまり、バッファがデータで満たされている) を確認します。
ノンブロッキング I/O のみを実行するプロセス (シングルスレッド) は、I/O の準備ができているファイル記述子から、別のファイル記述子の準備ができていないときに読み書きできます。ただし、プロセスは、システム コールを同期的に発行して、準備ができているすべてのファイル記述子に対して I/O を実行する必要があります。一方、非同期 I/O の場合、プロセスは I/O の完了 (データで満たされたバッファー) をチェックするだけです。非同期 I/O を使用すると、OS は、必要に応じて I/O を処理するために可能な限り並行して動作する自由があります。
それで、PythonのPOSIX aio_read/writeなどのシステムコールのラッパーはありますか?
Twisted には、ファイル記述子へのノンブロッキング書き込みがあります。非同期コードを作成している場合は、とにかくツイストを使用していると思います。:)
あなたが使用しようとすることができますThread
:
from threading import Thread
for file in list_file:
tr = Thread(target=file.write, args=(data,))
tr.start()
これは多かれ少なかれ疑似コードですが、理解していただければ幸いです。ここのスレッドは開いたままになっていることに注意してください。
私の経験では、メインスクリプトが終了している間もインタープリターはしばらくの間動作し続けますが( を使用する必要がありますjoin()
)、うまく機能しました。したがって、速度の向上は見た目よりも大きくなります
私はpythonへのaio.h入札を開発しています:pyaio
Linuxのみで動作します..
Python 3 にはそのような機能があるようです。PEP 3116を参照してください。