我想在我的计算机的多个处理器上并行运行命令。我可以这样做,
#!/bin/bash
./hello<params1.txt &
./hello<params2.txt &
wait
./hello<params3.txt &
./hello<params4.txt &
其中params文件是我传递给可执行文件`hello'的参数。
但是上面的代码在继续前两个命令之前等待两个完成前两个命令。由于我想运行的命令具有非常可变的运行时,我希望能够允许任何进程(在特定处理器上)提前完成以继续执行下一个命令,而不用等待其他命令批次完成。
有办法做到这一点吗?
答案 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。