bash 中的并行 for 循环,同时顺序执行另一个依赖于并行循环的任务

bash 中的并行 for 循环,同时顺序执行另一个依赖于并行循环的任务

在我的 bash 脚本中,我需要执行两个不同的函数taskAtaskB,它们采用整数 ( $i) 作为参数。由于taskB $i取决于 的完成taskA $i,因此以下简短的代码可以完成这项工作:

#!/bin/bash

taskA(){
  ...
}

taskB(){
  ...
}

for i in {1..100};
do
  taskA $i
  taskB $i
done

由于taskA可以独立运行在不同的位置$i,我可以创建一个信号量(取自此处并行化 Bash FOR 循环)并并行执行。但是,taskB $i需要完成taskA $i和 之前的taskB $(i-1).因此,我只是随后按顺序运行它们:

#!/bin/bash

open_sem(){
  mkfifo pipe-$$
  exec 3<>pipe-$$
  rm pipe-$$
  local i=$1
  for((;i>0;i--)); do
    printf %s 000 >&3
  done
}

run_with_lock(){
  local x
  read -u 3 -n 3 x && ((0==x)) || exit $x
  (
   ( "$@"; )
  printf '%.3d' $? >&3
  )&
}

taskA(){
  ...
}

taskB(){
  ...
}

N=36
open_sem $N
for i in {1..100};
do
  run_with_lock taskA $i
done

wait

for i in {1..100};
do
  taskB $i
done

为了进一步优化流程,是否可以保持信号量并行执行,同时taskA运行taskB,使其不“超车” taskA,等待其依赖的taskA完成?

相关内容