我如何 运行 在 bash 中并行执行 for 循环的主体

How can I run the body of the for loop parallely in bash

我有 4 个命令,它们在嵌套的 for 循环体内相互依赖(因此它们应该按顺序执行)。我想加快执行时间,所以我想 运行 这 4 个命令与接下来的 4 个命令并行,依此类推。我读到在这种情况下应该使用 &wait。但是,我不确定将它们放在哪里,因为据我所知,将它们放在每个 4 命令之后不会加快任何速度。

我有大约 10 个内核可以使用。

for p in {50,60,70,80,90,100,200,300}
do      
  for min_p_len in {1,2,3,4,5}
  do      
    for min_s_rem in {1,2,3}
    do 
      for length_threshold in {2,3,4}
      do
        command 1
        command 2
        command 3
        command 4
      done
    done    
  done         
done

将您的内部循环替换为:

for length_threshold in {2,3,4}
do
  {
    command 1
    command 2
    command 3
    command 4
  } &
done

这可能会使您的系统达到性能极限。

要更好地管理后台进程,请使用 xargs。使用标准输入将状态传递给 xargs。

for p in {50,60,70,80,90,100,200,300}
do      
  for min_p_len in {1,2,3,4,5}
  do      
    for min_s_rem in {1,2,3}
    do 
      for length_threshold in {2,3,4}
      do 
        # output variables on one line properly qouted
        declare -p p min_p_len min_s_rem length_threshold | base64 -w0
      done
    done    
  done         
done |
{
   work() {
    eval "$(base64 -d <<<"")"   # read the variables from arguments
    command 1
    command 2
    command 3
    command 4
  }
  export -f work
  xargs -d '\n' -P $(nproc) -n1 bash -c '"$@"' -- work
}