使用率 - python 並列処理 multiprocessing



Pythonマルチプロセッシングのプールプロセス制限 (3)

それは正しいです。 コアが4つの場合、4つのプロセスを同時に実行できます。 あなたはシステムを継続する必要があることを忘れないでください。プロセス番号をnumber_of_cores - 1に定義すると良いでしょう。 これは優先事項であり必須ではありません。 作成する各プロセスにはオーバーヘッドがあるため、実際にはこれを行うためにより多くのメモリを使用しています。 しかし、RAMが問題ではない場合は、それを行ってください。 Cudaやその他のGPUベースのライブラリを実行している場合は、別のパラダイムがありますが、それは別の質問です。

マルチプロセッシングモジュールからPoolオブジェクトを使用する場合、プロセス数はCPUコアの数によって制限されますか? たとえば4つのコアがある場合、たとえ8つのプロセスを持つプールを作成しても、一度に4つしか実行されません。


Answer #1

はい。 理論的には、作成できるプロセスには制限はありませんが、プロセスの非常識な量がすぐに開始されると、メモリ不足のためにシステムが死ぬことになります。 プロセスはスレッド間の共有スペースを使用せず、プロセスごとに個別のスペースを使用するため、スレッドよりもはるかに大きなフットプリントを占めることに注意してください。

したがって、最高のプログラミング方法は、システムのプロセッサ数に制限されたセマフォを使用することです。 おそらく

pool = multiprocessing.Semaphore(4) # no of cpus of your system.

あなたのシステムのコアの数を認識していない場合や、多くのシステムでコードを使用したい場合は、以下のような汎用コードを使用します。

pool = multiprocessing.Semaphore(multiprocessing.cpu_count()) 
#this will detect the number of cores in your system and creates a semaphore with that  value.  

PSしかし、常にコア数-1を使うのは良いことです。

お役に立てれば :)


Answer #2

あなたはあなたが好きなだけ多くのプロセスを求めることができます。 存在する可能性のある制限は、 multiprocessingではなくオペレーティングシステムによって課されます。 例えば、

 p = multiprocessing.Pool(1000000)

どんなマシンでも醜い死に苦しむ可能性が高い。 私はこれを入力すると私のボックスでそれを試していると、OSは狂ってRAMを交換する粉塵に私のディスクを研削している - それは約3000プロセスを作成した後、最終的にそれを殺した;-)

"一度に"何人が実行されるかについては、Pythonはそのことについて言及していません。 による:

  1. 同時に実行できるハードウェアの数。 そして、
  2. あなたのオペレーティングシステムが、現在実行中のマシン上のすべてのプロセスにハードウェアリソースを与える方法を決定する方法。

CPUバウンドタスクの場合、コアプロセスを実行するよりも多くのPoolプロセスを作成することは理にかなっていません。 あなたのマシンを他のものにも使用しようとするなら、コアよりもプロセスを少なくする必要があります。

I / Oバウンドタスクの場合 、プロセスはおそらくほとんどの時間をブロックする(I / Oが完了するのを待つ)ため、コアよりもかなり多くのPoolプロセスを作成するのが理にかなっています。





cpu-cores