考虑到可用的 CPU,如何在控制下运行多个“串行”进程?

考虑到可用的 CPU,如何在控制下运行多个“串行”进程?

假设您有一个必须在 maaaaaaaaany 文件上运行的二进制文件(假设文件编号从 1 到 N)。每个文件都必须通过调用这个二进制文件来处理(比如……类似 md5sum 的东西)。每次运行都会将结果保存在单独的文件中。所以......如果我们有 1000 个文件,而我们只有 4 个 CPU,我们不想做类似的事情(如果可能的话,实际上):

i=0; while [ $i -lt 1000 ]; do md5sum a_file_$i > result_$i & i=$(( $i + 1 )); done

因为(即使 bash 不会抱怨),我们最终会启动 1000 个进程,这将使计算机进入爬行模式。

是否有一个命令可供我使用,我可以告诉该命令它必须一次像 n 个进程一样运行(启动 n 个进程,监视一个进程何时完成,然后启动另一个进程,以便进程数跑步总是 n)?

答案1

GNU平行线是您正在寻找的工具。作者,奥莱·丹格,是这里的常客,并写了几个很好的答案关于它的问题

GNU 版本的xargsfromfindutils还提供了一些并行运行多个作业的选项。它可能更容易用于像您这样的简单工作,但远不如parallel.

例如:

find . -maxdepth 1 -type f -name 'a_file_*' -print0 | 
  xargs -0r -L 1 -P 4 sh -c '/usr/bin/md5sum "$1" > "$1.md5sum"' {}

这将运行取决于md5sum并行执行4 个作业 ( -P 4)。我还使用-L 1选项来限制每个作业一次处理一个文件名 - 没有这个(否则它只会运行 1 个具有 1000 个文件名的作业)

相关内容