0

我有一个计算密集型进程 X,它使用跨多个 CPU 的线程并行化。每个线程产生流输出,并且每个流应该单独连接到它自己的第二个进程 Y 的实例(运行的进程 Y 与线程的数量一样多)。X 和 Y 分别写入和读取二进制格式,因此吞吐量相当不错。我想尽量减少任何 I/O 开销,并且正在寻找最好的方法来做到这一点。目前我的设置看起来像这样(图中只有两个线程,但通常我会有八个以上):

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

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

exec 4>&-
exec 5>&-

一个问题是 bash 手册指出:“使用大于 9 的文件描述符的重定向应谨慎使用,因为它们可能与 shell 内部使用的文件描述符冲突。” 这并不完全清楚。另一个问题是我还没有找到建立终止的好方法:目前我使用“lsof -c programY”,但这感觉就像一个黑客。有没有更好或改进的解决方案?这里的“给定”是 X 是多线程和计算密集型的,Y 是单线程和计算密集型的,并且 X 的每个线程都必须连接到 Y 的一个实例。

4

1 回答 1

1

我可能会设计程序X,以便可以告诉它要启动多少个子进程并为其提供一个模板(实际上是一个printf()格式字符串)以用于如何创建这些进程:

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

并让它处理文件描述符等。

但是,如果做不到这一点,您可以使用 shell 脚本,例如:

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 ((...))循环bash相当于 Cfor循环。

于 2013-06-11T12:00:20.487 回答