我想使用各种参数多次运行 python 脚本。为此,我编写了以下 bash 脚本:
requests=(25 50 75 100)
factors=(3 6)
graphsizes=(25 50 75)
for request in "${requests[@]}"; do
for factor in "${factors[@]}"; do
for size in "${graphsizes[@]}"; do
echo "Now Running: n = ${request}, factor = ${factor}, size = ${size}" >> nohup.out;
echo nohup python3 -u main.py "$request" 50 "$factor" "$size" > ${request}_${factor}_${size}.log &
echo "Done Running: n = ${request}, factor = ${factor}, size = ${size}" >> nohup.out;
done
done
done
我;
在第一个和最后一个末尾添加,echo
因为我不希望它们并行运行。事实上,我希望对 python 脚本的每次调用main.py
都按顺序而不是并行运行,因为脚本本身已经并行化并且不想要任何竞争条件。
我知道通常我们使用 a;
来使作业按顺序运行,但是如果我&
在 nohup 行之后这样做,我会收到错误
syntax error near unexpected token `;'
如何使循环的每次迭代按顺序运行?
您在多行上编写脚本的方式,';' 由换行符暗示。您可以删除“;” 在最内层循环内的三行中的每一行的末尾,
for
脚本将按顺序运行。你只需要';' 如果您在它们之间应该有中断时将它们移动到同一行,例如当您将它们与您的规范do
放在同一行时。请注意以下重写脚本中for
的替代位置:do
当组合的数量变大时,您的计算机将不堪重负。
这就是 GNU Parallel 派上用场的地方:
如果您不想每个 CPU 内核运行一个作业,请更改 -j100%。