我有一个bash
如下循环:
for i in $(seq 0 $max); do
my_command $i
done
我想在n
核心上并行运行它。我知道我可以这样做
while [[ "$j" -le "$max" ]]; do
for i in $(seq 1 $ncores); do
my_command $j &
done
wait
done
但是如果my_command
的运行时间与 成线性关系$i
,那么我就是在等待运行时间最长的函数,从而浪费 CPU 周期。我如何才能不断调度新作业,以便$ncores
作业在任何给定时间运行?我是否需要在我的机器上本地运行实际的作业调度程序torque
来实现这一点,还是可以使用简单的脚本来完成bash
?
答案1
使用 GNU Parallel:
seq 0 $max | parallel my_command {}
答案2
或者使用 xargs:
seq 1 $max | xargs -n1 -P$ncores -I% mycommand %
看看它是如何工作的:
seq 1 9 | shuf | xargs -n1 -P3 -I% sh -c 'echo start %; sleep %; echo stop %'