我如何 运行 在 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
}
我有 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
}