跨多个核心在bash中运行循环过程

Isa*_*aac 4 parallel-processing bash centos

我有一个包含以下循环的shell脚本.

i=0  
upperlimit=$verylargevariable  
do  
   complexstuff RunManager file $i  
   i= 'expr $i +1'  
done
Run Code Online (Sandbox Code Playgroud)

这个脚本在四核机器上运行,据此top,在执行循环的一次迭代时,使用每个核心的大约15%.我想将它分布在四个核心上,以便循环的每次迭代执行complexstuff四次,每个核心一次,这样可以更有效地使用资源.我们谈论的是目前需要几个小时的计算,因此这里的效率不仅仅是良好的实践.(每次迭代的输出显然与前一次迭代无关.)

PS:主机是运行Cent-OS的服务器,如果有帮助的话.

Ole*_*nge 10

使用GNU Parallel,您可以:

seq $verylargevariable | parallel -j150% complexstuff RunManager file
Run Code Online (Sandbox Code Playgroud)

150%将在每个核心运行1.5个进程,因此如果它目前使用15%,这将在所有4个核心上给你大约100%.

要了解详情,请观看介绍视频:http://www.youtube.com/watch?v = OpaiGYxkSuQ


Céd*_*ien 3

除了 Ole Tange 解决方案(看起来很棒)之外,如果您的计算具有非常相似的持续时间,您可以尝试这样的方法:

i=0  
upperlimit=$verylargevariable  
do  
   complexstuff RunManager file $i &
   i= 'expr $i + 1'
   complexstuff RunManager file $i &
   i= 'expr $i + 1'
   complexstuff RunManager file $i &
   i= 'expr $i + 1'
   complexstuff RunManager file $i &
   i= 'expr $i + 1'
   wait
done
Run Code Online (Sandbox Code Playgroud)

这样,在每次运行循环时,您将创建 4 个 bash 子进程来启动您的计算(并且由于系统很棒,它会将它们分派到不同的核心上)。如果 4 个进程还不足以烧毁所有 cpu,请增加每个循环上创建的进程数。