4

マルチプロセッシング モジュールを使用して子プロセスをフォークしています。フォークすると、子プロセスは親プロセスのアドレス空間を取得するため、親と子で同じロガーを取得しています。親から引き継がれた値について、子プロセスのアドレス空間をクリアしたい。multiprocessing は下位レベルで fork() を実行しますが、exec() は実行しないことを知りました。私の状況でマルチプロセッシングを使用するのが良いかどうか、または os.fork() と os.exec() の組み合わせを使用する必要があるかどうか、または他の解決策があるかどうかを知りたいですか?

ありがとう。

4

2 に答える 2

8

スレッド関数であるかのようにプログラムから関数を実行しているためmultiprocessing、プロセスの状態の完全なコピーが必要です。ということfork()です。

によって提供されるより高いレベルのインターフェイスを使用する方multiprocessingが一般的に優れています。fork()少なくとも、リターン コードを自分で気にする必要はありません。

os.fork()すぐに使用できるサービスが少ない低レベルの関数ですが、コードmultiprocessingの部分的な再実装を犠牲にして、使用されるものすべてに使用できmultiprocessingます。だから、私はmultiprocessingあなたのために大丈夫だと思います。

ただし、プロセスのメモリ フットプリントが大きすぎて複製できない場合 (または、フォークを回避する他の理由がある場合 (データベースへの接続を開く、ログ ファイルを開くなど)、実行する関数を作成する必要がある場合があります)。新しいプロセス 別の python プログラム。次に、 を使用して実行しsubprocess、パラメータを に渡しstdin、キャプチャしstdout、出力を解析して結果を取得できます。

UPD: os.exec... 関数ファミリーは、プロセスを生成されたプロセスに置き換えるため、ほとんどの目的で使用するのが困難です (実行中のプログラムと同じプログラムを実行すると、メモリ内データを保持せずに最初から再起動します)。ただし、親プロセスの実行を継続する必要が本当にない場合はexec()、多少役立つ場合があります。

私の個人的な経験から: os.fork()Unix でデーモン プロセスを作成するために頻繁に使用されます。私はよく使用しますsubprocess(通信は標準入力/標準出力を介して行われます)。マルチプロセッシングを使用したことはほとんどありません。私が必要としたのは私の人生で一度もありませんos.exec...()

于 2013-02-05T07:41:45.193 に答える
4

子プロセスのロガーを独自のロガーに再バインドするだけです。他のOSについては知りませんが、Linuxでは、分岐によってメモリフットプリント全体が複製されるわけではありませんが(Elliohが述べたように)、「コピーオンライト」の概念が使用されます。したがって、子プロセスで何かを変更するまでは、親プロセスのメモリ スコープにとどまります。たとえば、100 個の子プロセス (メモリへの書き込みではなく読み取りのみ) をフォークして、全体的なメモリ使用量を確認できます。ではありませんがparent_memory_usage * 100、はるかに少ないです。

于 2016-10-18T01:03:24.120 に答える