2

何らかのデータを生成するプロセスがあり、このデータが互いに独立した 2 つの異なるプロセスによって消費されるとします。

この問題を解決する 1 つの方法は、生成されたデータをファイルに書き込み、他の 2 つのプロセスでそのファイルから読み取ることです。ファイルのサイズが大きくない場合はこれで問題ありませんが、データが多い場合は IO が高くなります。

データを消費するプロセスが 1 つしかない場合は、2 つのプロセスを接続してos.pipe()、一方の出力から他方の入力にデータを送り込むことができます。

ただし、2 つのコンシューマー プロセスがあるため、両方のコンシューマーがパイプから読み取ることができるように、パイプの読み取り側を複製する方法があるかどうかはわかりません。

4

2 に答える 2

2

パイプからのデータは 1 回だけ読み取ることができます。ただし、データを単純にコピーして 2 つの異なるファイル記述子に書き込む中間プロセスを使用することはできます。Unix システムでは、これは標準ツールによって行われますtee。POSIX シェルでの例:

$ exec 4> a
$ seq 3 | tee /dev/fd/4 > b

これにより、とのseq 3両方のファイルにの出力が書き込まれます。ab

Python で同じことを行うには、1つの呼び出しとプロセスのos.pipe()へのsubprocess.Popen()呼び出しを組み合わせて使用​​し、接続するプロセスごとに をtee1 つ呼び出します。subprocess.Popen()

producer = subprocess.Popen(["seq", "3"], stdout=subprocess.PIPE)
pipe_r, pipe_w = os.pipe()
tee = subprocess.Popen(["tee", "/dev/fd/{}".format(pipe_w)],
                       stdin=producer.stdout, stdout=subprocess.PIPE)
consumer1 = subprocess.Popen(["cat"], stdin=tee.stdout)
consumer2 = subprocess.Popen(["cat"], stdin=pipe_r)
producer.wait()
tee.wait()
consumer1.wait()
consumer2.wait()
os.close(pipe_r)
os.close(pipe_w)
于 2013-08-09T17:53:27.317 に答える
0

これはパイプによって返されるファイル記述子であるため、残念ながら元に戻すことはできません。ただし、いずれかのリーダー プロセスでデータを に追加し、multiprocessing.Queue両方がデータを読み取って後でドロップできるようにするというアイデアもあります。

ライター プロセスから各リーダーへのパイプもいつでも使用できます。また、データをやり取りするために使用できるshared memoryまたはなどの他のものもあります。dbus

あなたの問題をもっと詳しく説明していただけますか?

プラットフォームによっては、プロセスで複数のストリーム (stdout と 4 番目のストリームなど) を使用することもできますが、これは OS 間で移植できません。

于 2013-08-09T17:25:07.350 に答える