私は次のコードを持っている:実際のダウンロードタスクが非同期的に継続しながら、ThreadPoolExecutorコールバック?
from concurrent.futures import ThreadPoolExecutor
def download_contract_history(self, **kw):
ThreadPoolExecutor().map(lambda x: x.download_contract_history(**kw), self.instruments.values())
print("All downloads complete.")
を現時点では、すぐに「すべてのダウンロードが完了し、」印刷します。スレッドが実際に終了した後、ステートメントを印刷するにはどうすればよいですか? https://docs.python.org/dev/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutorで
ありがとうございました!なぜここでマルチプロセスが良いのか分かりますか? – cjm2671
これは、将来のパッケージとは対照的に、既存の、よくテストされたコードであるためです。インポートしたパッケージから同期バージョンが見つかりませんでした(ブロックされるので、最後まで印刷されません)。なぜスレッドではなくプロセスであるかを尋ねるのであれば、それはPythonの仕組みに関する大きな話題です。私はgoogle "python gil threading"と言いました。 – kabanus
各スレッドがIOを待っている時間のほとんどを費やしている場合、スレッドはそれほど悪くない。マッピングしている関数がURLからデータをダウンロードする場合マッピングしている関数が主に計算量、つまりCPUのビジーな作業である場合、スレッドは作業が並列化されないため、問題はありません。マルチプロセッシングでは、各マッピングされた関数は並行して作業できますが、シリアル化のオーバーヘッドがあります(親プロセスとサブプロセス間ではargsと結果の値をpickle/unpickする必要があります)。 – Anentropic