并行化具有大量迭代的 for 循环

RIc*_*ams 3 shell-script parallelism

我想并行化一个 for 循环,其中循环中的迭代次数可能非常大,例如 10^6。所以,如果我可以创建线程而不是进程会更好。怎么做?代码如下

N=$1

for (( i=0; i < $N; i++ )); do

    ./random >> output /* in each iteration one random number is appended to
                          a file "output" */                                

done
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 11

  1. 您不能从 shell 生成线程。
  2. 您不想从多个进程写入同一个文件。
  3. 如果你的random程序所做的只是生成一个数字,
    • 它应该足够快,您的循环将受到 io 限制。
    • 如果可以,您应该编辑它以接受一个参数并打印那么多数字。
    • 如果实际执行是瓶颈,您应该重新考虑如何生成数字。也许将代码发布到Code Review。

如果你真的真的还是想这样做,这样,做在大块:

for i in {0..9}; do
    for ((j = 1; j < $N/10; j++)); do
        ./random
    done > tmp$i &
    pid[$i]=$?
done
for i in {0..9}; do
    wait ${pid[$i]}
done
cat tmp{0..9} >> outfile
Run Code Online (Sandbox Code Playgroud)