Bash 双循环的并行化
Bash parallelization for double for loop
所以我有一个请求 REST API 的函数,它接受两个参数:实例和日期。我得到了一个实例列表和需要用两个 for 循环迭代的日期范围。一个约束是一次只能请求一个实例。
我尝试过使用 &
和 wait
,我的伪代码如下所示。
for each date:
for each instance:
do-something "$date" "$instance" &
done
wait
done
这实际上非常有效,因为一次只请求一个实例,并且只有在处理完所有实例后才会进行,因此不会同时请求任何实例。
问题是对某个实例的某些请求需要很长时间,因此其他较早处理的实例处于空闲状态。我怎么解决这个问题?
定义一个函数,它将按顺序处理每个日期的给定实例:
for_each_date () {
instance=
shift
for d in "$@"; do
some_command "$d" "$instance"
done
}
现在,为每个实例生成一个后台进程 运行 此函数。
dates=(2015-07-21 2015-07-22 2015-07-23) # For example
instances=(inst1 inst2 inst3)
for instance in "${instances[@]}"; do
for_each_date "$instance" "${dates[@]}" &
done
wait
每个后台作业将 运行 some-command
用于不同的实例,并且一次绝不会 运行 多个进程,因此您满足了第一个限制条件。同时,for_each_date
在旧请求完成后立即为其实例启动新请求,让您的机器尽可能忙碌。
使用 GNU Parallel 你会做:
parallel do-something ::: d a t e s ::: i n s t a n c e s
所以我有一个请求 REST API 的函数,它接受两个参数:实例和日期。我得到了一个实例列表和需要用两个 for 循环迭代的日期范围。一个约束是一次只能请求一个实例。
我尝试过使用 &
和 wait
,我的伪代码如下所示。
for each date:
for each instance:
do-something "$date" "$instance" &
done
wait
done
这实际上非常有效,因为一次只请求一个实例,并且只有在处理完所有实例后才会进行,因此不会同时请求任何实例。
问题是对某个实例的某些请求需要很长时间,因此其他较早处理的实例处于空闲状态。我怎么解决这个问题?
定义一个函数,它将按顺序处理每个日期的给定实例:
for_each_date () {
instance=
shift
for d in "$@"; do
some_command "$d" "$instance"
done
}
现在,为每个实例生成一个后台进程 运行 此函数。
dates=(2015-07-21 2015-07-22 2015-07-23) # For example
instances=(inst1 inst2 inst3)
for instance in "${instances[@]}"; do
for_each_date "$instance" "${dates[@]}" &
done
wait
每个后台作业将 运行 some-command
用于不同的实例,并且一次绝不会 运行 多个进程,因此您满足了第一个限制条件。同时,for_each_date
在旧请求完成后立即为其实例启动新请求,让您的机器尽可能忙碌。
使用 GNU Parallel 你会做:
parallel do-something ::: d a t e s ::: i n s t a n c e s