以下のサイトにあるmypool.pyを使い並列処理を実装しています。
http://d.hatena.ne.jp/halhorn/20100904/1283612722
処理内容としては、子プロセス(multiprocessing.Process)として、
tshark(wiresharkのCUI版)を起動し、
そのキャプチャ結果をmultiprocessing.Pipeで受け取るものです。
理由があり、終了待ちをしないといけないため、
multiprocessing.Process.joinで終了待ちをしています。
ところが、tsharkのキャプチャ数(データ量)が多くなると、
このjoinが終了しなくなります。(少ない場合はjoinは終了します)
joinの前に行っているPipe経由のrecv関数までは正常に処理できています。
送受信バッファの問題かなと考えましたが、recv関数後にpollを呼んでも
0が返る(受信すべきデータがない)ため原因がわかりません。
抽象的な文面で分かりにくくて申し訳ありませんが、
お気づきの点があり、アドバイスを頂けると助かります。
よろしくお願いします。
以上です。
>tsharkのキャプチャ数(データ量) これは64KB以上でしょうか? Popen.communicateで、Hangしている可能性もあるのでは。
コメントありがとうございます。64KBを超えた場合、Popen.communicateは使えないということでしょうか?その場合、どのような処理に置き換えれば回避できるでしょうか?
いえ、普通にstdoutとstderrにファイルオブジェクト)tempfile.TemporaryFileやuniqueな名前)を渡せばよいのでは。10年前の記事ですが、https://thraxil.org/users/anders/posts/2008/03/13/Subprocess-Hanging-PIPE-is-your-enemy/ この問題だとするならば、最初にも提起しましたが、止まる正確なバイト数を特定する所からではないでしょうか。
参考サイトありがとうございます。この対処と hayataka2049 さんに教えて頂いた対処でうまく行けそうな気がしてます。結果は別途報告させて頂きます!

回答1件
あなたの回答
tips
プレビュー