我想在并行运行100个文件的for循环中使用shell脚本。
当前,我有以下格式的shell脚本:
#!/bin/bash
NUM=10
python a1.py $((NUM + 0)) &
python a2.py $((NUM + 2)) &
python a3.py $((NUM + 4)) &
python a4.py $((NUM + 6)) &
python a5.py $((NUM + 8)) &
现在,如果我有a1.py
,a2.py
,a3.py
.... a100.py
,并且想并行运行它们,该如何做for循环?
答案 0 :(得分:4)
如果您拥有bash
第4版并运行此程序:
echo {10..208..2}
您将获得:
10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60
62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108
110 112 114 116 118 120 122 124 126 128 130 132 134 136 138 140 142 144 146
148 150 152 154 156 158 160 162 164 166 168 170 172 174 176 178 180 182 184
186 188 190 192 194 196 198 200 202 204 206 208
看起来像您的系列。然后,如果您想并行运行许多作业,则可以使用 GNU Parallel 。这为您提供{#}
作为职位编号的占位符。因此,如果运行此命令:
parallel -k echo {#} {} ::: {10..208..2}
您将获得:
1 10
2 12
3 14
4 16
5 18
因此,要运行实际的脚本,例如:
parallel -k --dry-run 'python a{#}.py {}' ::: {10..208..2}
示例输出
python a1.py 10
python a2.py 12
python a3.py 14
python a4.py 16
...
...
如果看起来不错,请在没有--dry-run
和-k
的情况下再次运行,后者会保留输出以便于调试。
TLDR;
对于 GNU Parallel ,我最简洁的回答是:
parallel python a{#}.py {} ::: {10..208..2}
或者如果您没有bash
版本4:
parallel python a{#}.py {} ::: $(seq 10 2 208)
答案 1 :(得分:1)
NUM=10
for ((i=0; i<100; i++)); do echo python a$(($i+1)).py $(($NUM+$i*2)); done
输出:
python a1.py 10 python a2.py 12 python a3.py 14 . . . python a98.py 204 python a99.py 206 python a100.py 208
如果这样可以,请使用:
NUM=10
for ((i=0; i<100; i++)); do python a$(($i+1)).py $(($NUM+$i*2)) & done