プロセスを通信リソースに接続する際のモジュールの使いやすさ以外に、個別のPython VMを起動するために使用する場合と、を使用してmultiprocessing
複数のプロセスを生成する場合の間に他の違いはありますか?multiprocessing
subprocess
2 に答える
Posixプラットフォームでは、multiprocessing
プリミティブは基本的にをラップしos.fork()
ます。これが意味するのは、マルチプロセッシングでプロセスを生成した時点で、すでにインポート/初期化されたコードが子プロセスに残っているということです。
初期化するものがたくさんあり、各サブプロセスが基本的にそれらの初期化されたオブジェクト(のコピー)に対して操作を実行する場合、これは恩恵になる可能性がありますが、サブプロセスで実行するものが完全に無関係である場合はそれほど役に立ちません。
multiprocessing
また、UNIXライクなプラットフォームでは、ファイルハンドル、ソケットなどのリソースにも影響があります。
一方、を使用すると、新しいプロセスsubprocess
を実行するたびに、まったく新しいプログラム/インタープリターが作成されます。Popen
これは、それらの間の共有メモリが少なくなる可能性があることを意味しますが、完全に別のプログラムにPopenしたり、同じプログラムに新しいエントリポイントを追加したりできることも意味します。
Windowsでは、Windowsがを提供しないため、multiprocessing
との間の違いは少なくなります。subprocess
fork()
通信の問題を無視した場合(つまり、個別のPython VMが相互に通信しない場合、または明示的に確立された他のメカニズムを介してのみ通信する場合)、他に実質的な違いはありません。(multiprocessing
特定の条件下では、特にUnixライクなプラットフォームは、fork
常に暗示されるfork-execペアではなく、より効率的なものを使用できると思いますmultiprocessing
が、いくつかのプロセスが含まれる場合、それは「実質的」ではありません[[ IOW、起動時のパフォーマンスの違いは、システム全体のパフォーマンスにとって重要ではありません]])。