1

プロセスのプールを作成することと、単にプロセスをループしてさらにプロセスを作成することの間に、(何らかの方法で) 違いはありますか?

これの違いは何ですか?:

pool = multiprocessing.Pool(5)
pool.apply_async(worker)
pool.join()

この?:

procs = []
for j in range(5):
        p = multiprocessing.Process(worker)
        p.start()
        procs.append(p)

for p in procs:
    p.join()

プールはより多くのコア/プロセッサを使用する可能性が高くなりますか?

4

1 に答える 1

5

プールのapply_asyncメソッドは、プールworkerから任意に選択されたプロセスで関数を 1 回だけ実行するため、2 つのコード例はまったく同じことを行いません。apply_async実際に同等にするには、 5 回呼び出す必要があります。

特定のタスクに対してどのアプローチがより適切であるかは、あなたが何をしているかに少し依存すると思います。multiprocessing.Poolプロセスごとに複数のジョブを実行できるため、プログラムの並列化が容易になる場合があります。たとえば、個別の処理が必要なアイテムが 100 万個ある場合、適切な数のプロセス (おそらく CPU コアと同じ数) を持つプールを作成し、100 万個のアイテムのリストを に渡すことができますpool.map。プールは、それらをさまざまなワーカー プロセスに配布します (そして、親プロセスに返される戻り値を収集します)。100 万個の個別のプロセスを起動するのはあまり現実的ではありません (おそらく OS が壊れるでしょう)。

一方、並行して実行するジョブの数が少なく、各ジョブを一度だけ実行する必要がある場合はmultiprocessing.Process、プールを設定してジョブを起動するのではなく、ジョブごとに個別の を使用するのが完全に合理的です。それからプールを取り壊します。

于 2013-08-14T04:37:32.087 に答える