Bash:后台多个 for 循环

Bash:后台多个 for 循环

这是在后台启动多个顺序处理的正确方法吗?

for i in {1..10}; do
    for j in {1..10}; do
        run_command $i $j;
    done &
done;

对于给定的 ,所有内容j都应该依次处理i,但所有内容都i应该同时处理。

答案1

你所拥有的外循环基本上是

for i in {1..10}; do
    some_compound_command &
done

some_compound_command这将在后台启动 10 个并发实例。它们将尽可能快地启动,但不会完全“同时”(即,如果some_compound_command需要非常时间很短,那么第一个很可能会在最后一个开始之前完成)。

碰巧是一个循环这一事实some_compound_command并不重要。这意味着您显示的代码是正确的内部j循环的迭代将按顺序运行,但内部循环的所有实例(外部i循环的每次迭代一个)将同时启动。

唯一要记住的是每个后台作业都将在子 shell 中运行。这意味着内部循环的一个实例中对环境所做的更改(例如,对 shell 变量值的修改、使用 更改当前工作目录cd等)在该特定后台作业之外将不可见。

您可能想要在循环之后添加一条wait语句,只是为了等待所有后台作业实际完成,至少在脚本终止之前:

for i in {1..10}; do
    for j in {1..10}; do
        run_command "$i" "$j"
    done &
done

wait

答案2

如果你有 GNU Parallel 你会这样做:

parallel -j0 'for j in {1..10}; do run_command {} $j; done' ::: {1..10}

好处之一是并行运行的输出run_commands不会混合。

相关内容