0

これは簡単な解決策だと思いますが、それは一日の終わりであり、私は頭が死んでいます. 私は現在、いくつかのプロセスを生成しています.1つのプロセスは、データを受信して​​ファイルに保存しています。もう 1 つはデータの解析で、3 番目はデータの保存をいつ停止するかをユーザー入力が知るのを待っています。

その方法を知る必要があるのは、while ループのブレークアウトです。親プロセスによって設定されたグローバル変数を使用したくないのですが、それが必要な場合は使用できます。現在、私のコードは次のようになっています。

while(packetReceived < totalToReceive):
    data, addr = sock.recvfrom(packetSize)

私の考えは次のようなものでした。

breakout = 0
while(packetReceived < totalToReceive || breakout != 0):
    data, addr = sock.recvfrom(packetSize)

しかし、どうにかブレイクアウトを設定する必要があります。どんな助けでも大歓迎です。

4

2 に答える 2

1

親プロセスにグローバル変数があるだけでは、状態を共有できません。これは機能しているように見えますが、時々しか機能しません。信頼性も予測性もありません。Windows を除いて、確実かつ予測どおりに動作することはありません。各子供は常にフラグの独自のコピーを持っているため、終了することはありません。

変数を共有することで本当にこれを行いたい場合は、ドキュメントのプロセス間で状態を共有multiprocessing.Valueするを参照してください。ただし、短いバージョンは次のとおりです。. そして、multiprocessing.Conditionその値を競合から保護するために a を使用します。そうしないと、子プロセスが親からの変更を確認する保証がないからです。

もちろんmmap、最小サイズの を作成し、条件の代わりにm[0]フラグとして使用するなどして、これを偽造することもできますが、実際にはそれほど単純ではありません。m.flush()

これを行う別の方法は、multiprocessing.Pipeまたは同様の方法を使用して、「今すぐシャットダウン」メッセージを渡すことです。子プロセスはそれぞれスレッドを生成してパイプでブロックするか、パイプとソケットをselect一緒に投げるか、または他のすべての通常のトリックを実行できます。

この場合、別のより簡単なオプションがあるかもしれません: そもそも使用multiprocessingしないでください。明らかに、バックグラウンド タスクはソケットからの読み取りをループしているだけなので、CPU バウンドではありませんthreading

また、他の方法で設計を単純化できるかもしれないと思います。これにより、この問題を完全に取り除くことができます。読み取りジョブと処理ジョブの間に、キューや直接シーケンシャル パイプラインの代わりにファイルが必要ですか? ユーザー入力とソケットを同じイベント ループに投げることはできますか (selectユーザー入力がstdinWindows を気にしない場合はプレーン オールドです。ユーザー入力が Qt GUI の場合はa のQSocket代わりに使用します。学習したい場合は; など)。または、^C で処理できる実際のユーザー入力、または単に「今すぐ終了」(または「ソケットをシャットダウンして残りのメッセージを処理」) がありますか?socket.sockettwistedtwisted

于 2013-01-18T00:28:29.557 に答える
0

マルチプロセッシング変数を使用する代わりに、「毒薬」の存在をチェックしてループから抜け出すことを検討してください。

たとえば、次のように変更します。

data, addr = sock.recvfrom(packetSize)

次のようなものに:

received = sock.recvfrom(packetSize)
if received is None:
    break
data, addr = received

プロセスに値を送信することで、ループから抜け出すようにプロセスにシグナルを送ることができNoneます。あなたsockが送受信できるかどうかはわかりませんNoneが、一般的な考え方は同じです。

于 2013-01-18T00:35:45.247 に答える