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完成?

相關內容