親プロセスにグローバル変数があるだけでは、状態を共有できません。これは機能しているように見えますが、時々しか機能しません。信頼性も予測性もありません。Windows を除いて、確実かつ予測どおりに動作することはありません。各子供は常にフラグの独自のコピーを持っているため、終了することはありません。
変数を共有することで本当にこれを行いたい場合は、ドキュメントのプロセス間で状態を共有multiprocessing.Value
するを参照してください。ただし、短いバージョンは次のとおりです。. そして、multiprocessing.Condition
その値を競合から保護するために a を使用します。そうしないと、子プロセスが親からの変更を確認する保証がないからです。
もちろんmmap
、最小サイズの を作成し、条件の代わりにm[0]
フラグとして使用するなどして、これを偽造することもできますが、実際にはそれほど単純ではありません。m.flush()
これを行う別の方法は、multiprocessing.Pipe
または同様の方法を使用して、「今すぐシャットダウン」メッセージを渡すことです。子プロセスはそれぞれスレッドを生成してパイプでブロックするか、パイプとソケットをselect
一緒に投げるか、または他のすべての通常のトリックを実行できます。
この場合、別のより簡単なオプションがあるかもしれません: そもそも使用multiprocessing
しないでください。明らかに、バックグラウンド タスクはソケットからの読み取りをループしているだけなので、CPU バウンドではありませんthreading
。
また、他の方法で設計を単純化できるかもしれないと思います。これにより、この問題を完全に取り除くことができます。読み取りジョブと処理ジョブの間に、キューや直接シーケンシャル パイプラインの代わりにファイルが必要ですか? ユーザー入力とソケットを同じイベント ループに投げることはできますか (select
ユーザー入力がstdin
Windows を気にしない場合はプレーン オールドです。ユーザー入力が Qt GUI の場合はa のQSocket
代わりに使用します。学習したい場合は; など)。または、^C で処理できる実際のユーザー入力、または単に「今すぐ終了」(または「ソケットをシャットダウンして残りのメッセージを処理」) がありますか?socket.socket
twisted
twisted