目前,我一直在高效地运行耗时的模拟。我的目的是并行运行4个模拟,因为这是一个单线程应用程序和一个四核系统。我不得不使用shell脚本的变体:
./sim -r 1 &
./sim -r 2 &
./sim -r 3 &
./sim -r 4 &
wait
./sim -r 5 &
./sim -r 6 &
./sim -r 7 &
./sim -r 8 &
wait
... (another 112 jobs)
使用这段代码时,会反复等待。我还尝试将任务分成四个脚本并运行每个脚本,结果是一个脚本完成,而另一个脚本有大约30%的剩余作业。我无法预测模拟需要多长时间。
任何时候都可以运行4个模拟的建议?
3条答案
按热度按时间fnatzsnv1#
在Ubuntu中安装
moreutils
软件包,然后使用parallel
实用程序:ioekq8ef2#
如果您不想安装
parallel
实用程序(假设它按指示工作,它看起来很整洁),那么您可以修改此Perl脚本(基本上,更改执行的命令),并可能减少监视:输出示例:
wgeznvg73#
for
循环创建了一个后台进程池,它从共享的标准输入中读取数据以启动模拟。每个后台进程在其模拟运行时“阻塞”,然后从seq
命令中读取下一个作业号。如果没有
for
循环,它可能更容易理解:假设
sim
花费非平凡的时间量来运行,第一个while
将从其标准输入读取1,第二个2,等等。无论哪个sim
首先完成,该while
循环将从标准输入读取read
5;下一个要完成的将读取6,依此类推。一旦最后一个模拟开始,每个read
将失败,导致循环退出。