Popenを使ってテストC++プログラムを呼び出すPythonプログラムがあります。テスト用のC++プログラムは単に0-99999をstdoutに書き出します。 Pythonプログラムには、別々のプロセスとして実行する必要がある2つの関数があります。 1つの関数funcAは、C++プログラムを起動し、stdoutパイプから整数を読み取り、それらの整数を共有キューに挿入する必要があります。もう1つの関数funcBは、Queueが空になるまで、Queueの整数を読み取り、出力する必要があります。私はいくつかの問題/私は下に私のコードと一緒にその下に掲載される質問があります。Python:サブプロセス、パイプデータ、マルチプロセスに関する質問
- funcAが(C++プログラム)が終了するまで、funcAがC++プログラムのstdoutから読み込む正しい方法は何ですか?
- すべてのintが処理されるまでfuncBが共有キューから読み込む正しい方法は何ですか?
質問1の私の現在の方法はうまくいきますが、キューがいっぱいになるなどチェックしない問題があるかもしれません。また、すべての数字がプリントアウトされず(約98000で停止します)、これはfuncAと何らかの関係があり、共有キューを終了して中断させる可能性がありますか?私は質問2のために何をすべきか正確には分かっていません。なぜなら、ドキュメンテーションは並行処理環境で空に依存することができず、しばらく(1)使用したくないということを述べているからです。
import multiprocessing
import subprocess
import Queue
def funcA(intQueue):
# call C++ program
handle = subprocess.Popen(['../C++/C++.exe'], stdout=subprocess.PIPE)
while(handle.returncode == None):
handle.stdout.readline()
intQueue.put(handle.stdout.readline())
handle.poll()
def funcB(intQueue):
try:
while(1):
print intQueue.get(True, 2)
except Queue.Empty:
pass
if __name__ == "__main__":
# shared Queue for all the processes
intQueue = multiprocessing.Queue()
# producer - receives ints from the C++ stdout and inserts into Queue
multiprocessing.Process(target=funcA, args=(intQueue,)).start()
# consumer - prints ints from the Queue
multiprocessing.Process(target=funcB, args=(intQueue,)).start()
私の質問1解決策は、C++プログラムがPythonプログラムが処理しているよりも遅い出力を生成している場合に問題になります。 –