0

複数の CPU にまたがるスレッドを使用して並列化された単一の計算集約型プロセス X があります。各スレッドはストリーム出力を生成し、各ストリームは 2 番目のプロセス Y の独自のインスタンスに個別に接続する必要があります (スレッドと同じ数のプロセス Y が実行されます)。X と Y はそれぞれバイナリ形式の書き込みと読み取りを行うため、スループットは非常に良好です。I/O オーバーヘッドを最小限に抑えたいと考えており、そのための最善の方法を探しています。現時点で、私のセットアップは次のようになっています (2 つのスレッドのみで示されていますが、通常は 8 つ以上のスレッドがあります)。

exec 4> >( programY > out.4 )
exec 5> >( programY > out.5 )

programX-that-writes-to-fd-4-and-5

exec 4>&-
exec 5>&-

問題の 1 つは、bash のマニュアルに次のように記載されていることです。これは正確には明らかではありません。もう 1 つの問題は、終了を確立する良い方法が見つからないことです。現在、「lsof -c programY」を使用していますが、ハックのように感じます。より良い、または改善された解決策はありますか? ここで「与えられている」のは、X はマルチスレッドで計算量が多く、Y はシングルスレッドで計算量が多く、X の各スレッドは Y のインスタンスに接続する必要があるということです。

4

1 に答える 1

1

おそらく、起動する子プロセスの数を通知し、それらのプロセスを作成する方法のテンプレート (実質的には書式文字列) をX与えることができるように、プログラムを設計します。printf()

alt-X -n 100 -f "Y > out.%d"

ファイル記述子などを処理するためにそのままにしておきます。

ただし、それができない場合は、次のようなシェル スクリプトを使用できます。

for ((i = 4; i < 104; i++))
do eval "exec $i> >(programY > out.$i)"
done

programX -d 4 -n 100 &   # Tell programX to write on file descriptors 4 to 103.

# Optionally
for ((i = 4; i < 104; i++))
do eval "exec $i>&-"
done

wait

このwaitコマンドは、すべての子プロセスが終了するのを待ってから続行します。AFAICT、これには「プロセス置換」のプロセスを待つことは含まれていません。

このeval操作は、「同じ」コードを 100 回書き出すことを避けるために必要です。for ((...))ループはCbashループと同等ですfor

于 2013-06-11T12:00:20.487 に答える