データのコレクションを取得する Python アプリケーションがあり、そのコレクション内のデータごとにタスクを実行します。タスクには遅延が伴うため、完了するまでに時間がかかります。この遅延のため、各データが後でタスクを実行するのではなく、すべてが並行して実行されるようにします。マルチプロセスを使用する必要がありますか? またはこの操作のスレッド?
スレッドを使用しようとしましたが、問題が発生しました。多くの場合、一部のタスクが実際には起動しませんでした。
データのコレクションを取得する Python アプリケーションがあり、そのコレクション内のデータごとにタスクを実行します。タスクには遅延が伴うため、完了するまでに時間がかかります。この遅延のため、各データが後でタスクを実行するのではなく、すべてが並行して実行されるようにします。マルチプロセスを使用する必要がありますか? またはこの操作のスレッド?
スレッドを使用しようとしましたが、問題が発生しました。多くの場合、一部のタスクが実際には起動しませんでした。
本当に計算に縛られているのであれば、マルチプロセッシングモジュールを使用するのがおそらく最も軽量なソリューションです(メモリ消費と実装の難しさの両方の点で)。
I / Oバウンドの場合、通常、スレッドモジュールを使用すると良好な結果が得られます。スレッドセーフストレージ(キューなど)を使用してデータをスレッドに渡すようにしてください。または、スポーンされたときに固有の単一のデータを渡します。
PyPyはパフォーマンスに重点を置いています。計算にバインドされた処理に役立つ多くの機能があります。また、ソフトウェアトランザクショナルメモリもサポートしていますが、それはまだ本番品質ではありません。約束は、マルチプロセッシング(いくつかの厄介な要件があります)よりも単純な並列または並行メカニズムを使用できることです。
スタックレスPythonもいいアイデアです。Stacklessには、上記のように移植性の問題があります。Unladen Swallowは有望でしたが、現在は機能していません。Pystonは、速度に焦点を当てたもう1つの(未完成の)Python実装です。PyPyとは異なるアプローチを採用しているため、より優れた(または単に異なる)スピードアップが得られる可能性があります。
タスクは順次実行されますが、並行して実行されているような錯覚があります。タスクは、ファイルまたは接続 I/O に使用する場合に適しています。軽量であるためです。
各プロセスが 1 つの CPU (またはコア) で実行されるため、プロセスが並列に実行されるため、Pool を使用したマルチプロセスが適切なソリューションになる可能性があります。
マルチプロセスのセットアップは非常に簡単です。
from multiprocessing import Pool
def worker(input_item):
output = do_some_work()
return output
pool = Pool() # it make one process for each CPU (or core) of your PC. Use "Pool(4)" to force to use 4 processes, for example.
list_of_results = pool.map(worker, input_list) # Launch all automatically
IronPython は、CPython や GIL とは異なり、真のマルチスレッドを備えています。したがって、あなたが何をしているかによっては、一見の価値があるかもしれません。しかし、あなたのユースケースはマルチプロセッシングモジュールに適しているようです。
スタックレス python を推奨する人にとって、私はその専門家ではありませんが、実際にはまったく並列ではないソフトウェアの「マルチスレッド」について話しているように思えます (まだ 1 つの物理スレッドで実行されるため、拡張することはできません)複数のコア。) これは、非同期 (ただしシングルスレッドで非並列) アプリケーションを構築するための代替方法にすぎません。
Twistedを見たいと思うかもしれません。これは、非同期ネットワーク タスク用に設計されています。