0

長い期間など長時間実行されるプロセスで同じスレッドを使用しておいてください。Pythonは私が並列私は6時間以上稼働を維持したいモデルを持っている

pool = multiprocessing.Pool(10) 
for subModel in self.model: 
    pool.apply_async(self.compute, subModel, features) 
pool.close() 
pool.join() 

私が持っているような問題は今、遅すぎますモデルが6時間に何回も実行されている間に、10スレッドを構築および分解するたびに、call pool = multiprocessing.Pool(10)およびpool.join()を呼び出します。

私が考えている解決策は、バックグラウンドで実行されている10個のスレッドを維持することです。新しいデータが入ってくるたびに新しいスレッドを作成して解体することを心配せずにすぐにモデルに入ります。

Pythonで長時間実行するプロセスを持つことができ、何度も何度もやり直す必要はありませんか?

+0

一度に実行できるPythonスレッドは1つしかないため、パフォーマンスが向上しないことにご注意ください。 – nwp

+0

GILのスレッドクラスと違って、multiprocessing.poolは複数のスレッドを同時に実行できると思っています –

+0

@nwp 'multiprocessing.Pool'はGILの影響を受けません。プールに「スレッド」を持つものとして言及しても間違っています。 – Sneftel

答えて

1

Poolには、1セットのタスクを送信した後にclose()join()(破棄)する必要はありません。あなたのapply_async()が完了する前に完了したことを確認したい場合は、代わりにapply()に電話して、次回同じPoolを使用してください。または、タスクを待っている間に他の処理を実行できる場合は、apply_asyncによって返された結果オブジェクトを保存し、完了しないと続行できない場合はwait()を呼び出します。

+0

thx a lot Sneftel –

関連する問題