Rad*_*led 8 bash background-process for parallelism
这是在后台启动多个顺序处理的正确方法吗?
for i in {1..10}; do
for j in {1..10}; do
run_command $i $j;
done &
done;
Run Code Online (Sandbox Code Playgroud)
所有j
后应相互给予处理i
,但都i
应该被同时处理。
您拥有的外循环基本上是
for i in {1..10}; do
some_compound_command &
done
Run Code Online (Sandbox Code Playgroud)
这将some_compound_command
在后台启动 10 个并发实例。他们将开始尽可能快地,但不完全“都在同一时间”(即,如果some_compound_command
需要很短的时间,那么第一个可能是最后一个开始之前完成)。
some_compound_command
恰好是一个循环的事实并不重要。这意味着您显示的代码是正确的,因为内循环的迭代j
将按顺序运行,但内循环的所有实例(外循环的每次迭代一个i
)将同时启动。
唯一要记住的是,每个后台作业都将在子 shell 中运行。这意味着cd
在内循环的一个实例中对环境所做的更改(例如,对 shell 变量的值的修改、当前工作目录的更改等)在该特定后台作业之外将不可见。
您可能想要添加的是wait
循环后的语句,以等待所有后台作业实际完成,至少在脚本终止之前:
for i in {1..10}; do
for j in {1..10}; do
run_command "$i" "$j"
done &
done
wait
Run Code Online (Sandbox Code Playgroud)