「標準」のサブプロセス パイプライン手法 (例: http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline ) を 2 つのパイプラインに「アップグレード」できますか?
# How about
p1 = Popen(["cmd1"], stdout=PIPE, stderr=PIPE)
p2 = Popen(["cmd2"], stdin=p1.stdout)
p3 = Popen(["cmd3"], stdin=p1.stderr)
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
p1.stderr.close()
#p2.communicate() # or p3.communicate()?
OK、実際には別の使用例ですが、最も近い出発点はパイプラインの例のようです。ところで、「通常の」パイプラインの p2.communicate() はどのように p1 を駆動するのでしょうか? 参照用の通常のパイプラインは次のとおりです。
# From Python docs
output=`dmesg | grep hda`
# becomes
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]
communicate()
最終的には、どのような種類の「プロセス グラフ」(または単なるツリーか?) がサポートできることに興味があると思いますが、一般的なケースについては別の日に譲ります。
更新: ベースライン機能は次のとおりです。communicate() なしで、p1.stdout と p2.stdout から読み取る 2 つのスレッドを作成します。メイン プロセスでは、p1.stdin.write() を介して入力を挿入します。問題は、単に communicate() を使用して 1 ソース、2 シンク グラフを駆動できるかどうかです。