我有 N = 128 个(假设)任务需要完成,,,task 0
...。task 1
每个task N-1
任务需要花费未知的时间才能完成,并且可能以任何顺序完成。我在一台具有大量内核的机器上,但我一次只想运行其中 16 个任务。是否有可以自动执行此操作的实用程序?
我考虑过
$ for i in {0..127}; do nice -n 19 ./task $i & done;
但这会同时运行所有任务。相反,我希望可以启动前 16 个任务,然后在任务完成时用新任务代替。
答案1
使用 GNU Parallel:
$ parallel -j16 ./task ::: {0..127}
使用 Moreutils平行线:
$ parallel -j16 ./task -- {0..127}
使用 Make:
$ make -j16 {0..127}
Makefile(不确定是标准的还是 GNU Make 特定的):
.PHONY: $(MAKECMDGOALS) %: ./task $@
编写你自己的:
#!/usr/bin/env bash inputs=( {0..127} ) nproc=16 njobs=0 for input in "${inputs[@]}"; do until (( njobs < nproc )); do wait -n; (( --njobs )) done ./task "$input"& (( ++njobs )) done while (( njobs )); do wait -n; (( --njobs )) done