17

プロセスを通信リソースに接続する際のモジュールの使いやすさ以外に、個別のPython VMを起動するために使用する場合と、を使用してmultiprocessing複数のプロセスを生成する場合の間に他の違いはありますか?multiprocessingsubprocess

4

2 に答える 2

22

Posixプラットフォームでは、multiprocessingプリミティブは基本的にをラップしos.fork()ます。これが意味するのは、マルチプロセッシングでプロセスを生成した時点で、すでにインポート/初期化されたコードが子プロセスに残っているということです。

初期化するものがたくさんあり、各サブプロセスが基本的にそれらの初期化されたオブジェクト(のコピー)に対して操作を実行する場合、これは恩恵になる可能性がありますが、サブプロセスで実行するものが完全に無関係である場合はそれほど役に立ちません。

multiprocessingまた、UNIXライクなプラットフォームでは、ファイルハンドル、ソケットなどのリソースにも影響があります。

一方、を使用すると、新しいプロセスsubprocessを実行するたびに、まったく新しいプログラム/インタープリターが作成されます。Popenこれは、それらの間の共有メモリが少なくなる可能性があることを意味しますが、完全に別のプログラムにPopenしたり、同じプログラムに新しいエントリポイントを追加したりできることも意味します。

Windowsでは、Windowsがを提供しないため、multiprocessingとの間の違いは少なくなります。subprocessfork()

于 2010-02-16T21:10:28.950 に答える
5

通信の問題を無視した場合(つまり、個別のPython VMが相互に通信しない場合、または明示的に確立された他のメカニズムを介してのみ通信する場合)、他に実質的な違いはありません。(multiprocessing特定の条件下では、特にUnixライクなプラットフォームは、fork常に暗示されるfork-execペアではなく、より効率的なものを使用できると思いますmultiprocessingが、いくつかのプロセスが含まれる場合、それは「実質的」ではありません[[ IOW、起動時のパフォーマンスの違いは、システム全体のパフォーマンスにとって重要ではありません]])。

于 2010-02-16T21:05:41.953 に答える