在 Linux 上并行调度任务

在 Linux 上并行调度任务

我有 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
    

相关内容