問題

私はいくつかのコールバック関数を持っており、複数のプロセスとして起動し、それらをすべて親プロセスからのシグナル経由で終了させたいと思います。

これを行う私の現在の方法は、multiprocessing.Valueで共有c_boolを作成し、それをTrueに設定し、作成時にすべてのプロセスに配布することです。私のプロセスはすべて、共有ブールを使ってwhileループを実行します。

 while myC_bool: ...keep running...
 

次に、親プロセスからboolをFalseに切り替えるだけで、すべての子プロセスが最終ループを完了して終了します。

私は多くの人々から言われており、マルチプロセッシングを使用するときに共有メモリを使用しないようにする必要があることをドキュメントで読んでいます。 私はこれを避ける最善の方法は、プロセスをdaemonizeし、それにカスタムシグナルハンドラを与え、それをsigint/sigterm/etc ...

私の質問は、排他的にループを維持するためにboolを使用していて、親プロセスから値を変更するだけです。複数の子プロセスから読み込み、すべての子プロセスをすばやく安全に終了させるための適切なソリューションですか? x個のsigintを送信するよりも、すべての子が共有ブールを見るのにオーバーヘッドが少ないように感じます。

daemonizingはより良い解決策になるでしょうか?もしそうなら、私は理由を理解する助けをしたいと思います。

  ベストアンサー

あなたの解決策には多くの理由があります:

  • 信号よりも考えやすいのです
  • 対処すべきクロスプラットフォームの問題は少ない。
  • あなたはすでにこのように動作するコードを持っています。
  • 将来、「優雅なシャットダウン」メカニズムを追加するのは簡単です。

...等々。

あなたが気にするすべてのプラットフォームでmultiprocessingと基礎となるOSプリミティブが同期せずに動作することが保証されていることを自分自身に証明できない限り、共有ブールへのすべてのアクセスの周りにLockなどを置く必要があることに注意してください。それはまさに複雑ではありませんが、一度それを行ったら、例えば、共有ブールがなければEventはさらに簡単かもしれません。

いずれにしても、それらのいずれかがあなたの理由であれば、私は素晴らしいと思います。しかし、あなたの質問によると、あなたは実際にパフォーマンスのためにこれを選択しました:

1つの共有ブールを見て、x個のsigintを送信するよりも、すべての子供のオーバーヘッドが少ないように感じます。

それがあなたの理由なら、あなたはほとんど間違っています。子供たちはいくつかのループを通して毎回共有ブールを見なければならず、信号は各子に一度だけ送信する必要があります。したがって、あなたのオーバーヘッドは、このようにはるかに高くなるでしょう。

しかし、実際には、子プロセスごとに1つの信号を送信するオーバーヘッド、またはプロセスごとに1回インタープロセスロックを取得することさえ、有用なプログラムのボトルネックに近い場所にあるとは想像できません。最初にここでオーバーヘッドが重要なのはなぜですか?最も簡単な方法で何が最も意味をなさないのですか?

  同じタグがついた質問を見る

pythonmultiprocessing