マルチプロセッシングモジュールからプールオブジェクトを使用する場合、プロセスの数はCPUコアの数によって制限されますか?例えば。 4つのコアがある場合、8つのプロセスでプールを作成しても、一度に実行されるのは4つだけですか?
必要な数のプロセスを要求できます。存在する可能性のある制限は、multiprocessing
ではなく、オペレーティングシステムによって課せられます。例えば、
p = multiprocessing.Pool(1000000)
どんなマシンでもい死に至る可能性があります。私はこれを入力しながらボックスで試していますが、OSはディスクを粉砕してダスト交換しますRAM狂気-約3000のプロセスを作成した後、最終的にそれを殺しました;-)
「一度に」いくつ実行するかについては、Pythonはその中に発言権がありません。
CPUにバインドされたタスクの場合、実行するコアがあるより多くのPool
プロセスを作成するsenseを行いません。マシンを他の目的にも使用する場合は、コアよりも少ないプロセスを作成する必要があります。
I/Oバウンドタスクの場合、mayコアよりもかなり多くのPool
プロセスを作成するのが理にかなっています。/Oを完了する)。
はい。理論的には、作成できるプロセスに制限はありませんが、一度に開始される異常な量のプロセスは、メモリ不足のためにシステムを停止させます。プロセスはスレッド間で共有スペースを使用せず、プロセスごとに個別のスペースを使用するため、スレッドよりもはるかに大きなフットプリントを占有することに注意してください。
したがって、プログラミングのベストプラクティスは、システムのプロセッサの数に制限されたセマフォを使用することです。たぶん
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.
P.S。ただし、常にコア数-1を使用することをお勧めします。
お役に立てれば :)
設定できる制限はありませんが、CPUバウンドプロセスに使用するのに便利な数値(ここで探していると思われます)を理解したい場合は、次を実行できます。
>>> import multiprocessing
>>> multiprocessing.cpu_count()
1
制限に関するいくつかの良い注意点(特にLinuxの場合)は、回答に記載されています here :
それは正しいです。 4つのコアがある場合、4つのプロセスを同時に実行できます。続行する必要のあるシステム要素があることを思い出してください。プロセス番号をnumber_of_cores - 1
。これは優先設定であり、必須ではありません。作成するプロセスごとにオーバーヘッドが発生するため、実際にはより多くのメモリを使用してこれを実行しています。しかし、RAMが問題ではない場合、それを選択してください。Cudaまたは他のGPUベースのライブラリを実行している場合、異なるパラダイムがありますが、それは別の質問です。