并行化Shell脚本,而无需等待批处理完成

时间:2017-01-24 11:52:12

标签: shell parallel-processing

我想在我的计算机的多个处理器上并行运行命令。我可以这样做,

#!/bin/bash

./hello<params1.txt &
./hello<params2.txt &
wait
./hello<params3.txt &
./hello<params4.txt &

其中params文件是我传递给可执行文件`hello'的参数。

但是上面的代码在继续前两个命令之前等待两个完成前两个命令。由于我想运行的命令具有非常可变的运行时,我希望能够允许任何进程(在特定处理器上)提前完成以继续执行下一个命令,而不用等待其他命令批次完成。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:1)

可以使所需的队列行为(但不一定是CPU分配)与command grouping一起使用,如下所示:

{ ./hello<params1.txt && ./hello<params3.txt ; } &
{ ./hello<params2.txt && ./hello<params4.txt ; }

如上所述的演示:

{ { echo a && sleep 2 && echo b ; } & 
  { echo c && sleep 1 && echo d ; } } | tr '\n' ' ' ; echo 

输出:

a c d b 

答案 1 :(得分:0)

据我所知,您无法为CPU分配作业,也无法创建自己的每CPU作业队列。

您可以实现一个脚本,在该脚本中创建某种作业列表(例如,到FIFO),在后台启动单独的工作进程一次一个地读取作业(即从所述FIFO),执行作业并等待它完成,然后转到下一个,直到没有其他工作可用。然后,您的主脚本将等待这些工作程序后台进程(所有进程并行执行),并在最后一个进程完成后退出。

通过这种方式,您可以控制一次运行多少个作业,但OS调度程序将决定分配给每个作业的CPU数量,并且一个作业本身可以并行并使用多个CPU。