如何在后台运行最多4个作业?

时间:2014-10-22 17:29:57

标签: bash

我使用bash脚本来通过使用&符号在后台运行C ++程序来使用多核。 (我是一名做蒙特卡罗模拟的数学家)。

这样我可以在后台多次运行C ++程序。例如:

for x in $(seq 1 1 100)
do 
./program_name &
done

有时program_name会快速运行,有时会运行缓慢。这是随机的,不可能提前知道。这提示我的问题:

如何制作,以便在任何给定时间,同时运行的作业不会超过4个? 让我们假设目前正在运行4个作业。我想要它,所以一旦完成,下一个开始。

3 个答案:

答案 0 :(得分:1)

在GNU,FreeBSD和OSX上,您可以使用xargs

echo {1..100} | xargs -n 1 -P 4 ./program_name

或者,您可以安装和使用GNU parallel,这是针对这类事情而做的(对于4个作业而不是1个作业/核心,添加-j 4):

parallel --gnu ./program_name ::: {1..100}

答案 1 :(得分:1)

这篇文章的其他解决方案比我在这里展示的更好。但我想记录我的“不完美的一个”来完成整理。它完成后无法将新作业添加到队列中......这是一件坏事,因为它会创建空闲时间。

但优点是你不需要安装任何东西。我希望这也不会容易出错。

count=1 # current number of jobs processing
j=4 ## maximum number of jobs

for x in $(seq 1 1 10)
do 
 echo Currently running programe $x
 ## CPP code goes here
 sleep $x &  ## Pretend it takes x seconds to complete

 count=$((count+1))  ## add one to the no. jobs running  

  if [ "$count" -gt "$j" ]; then
  echo "Waiting for jobs to finish"
  wait
  count=1
  fi
done

一种效率明显低的方法,我欢迎任何改进。

答案 2 :(得分:0)

( #Start a subshell
  N=4 #Specify number of jobs
  for((i=1;i<100;i++)) 
   do [ $((i%N)) = 0 ] && wait #Wait every N jobs
    (sleep 1; echo "$i";)&      #Some task
   done
 wait 
)

逻辑非常简单,可以变成单行。 您需要一个subhel来防止干扰我们不想等待的当前会话后台运行的进程。