我有多组作业,并且所有作业都可以并行运行,因此我希望将它们并行化以获得更好的吞吐量。
这就是我目前正在做的事情: 我使用多处理库编写了一个python脚本,同时在一个集合中运行作业。完成一组中的所有作业后,将调用另一组作业(脚本)。这是低效的,因为集合中的每个作业都有不同的执行时间。
最近,我注意到了GNU parallel,我认为它可能有助于改进我的脚本。但是,一组作业具有一些预处理和后处理任务,因此无法运行随机作业。
总之,我想 1)确保在启动作业之前完成预处理 2)在一组中的作业全部完成后运行后处理。
这就是我想要做的事情:
我想知道如何使用GNU并行执行此类操作,甚至不确定GNU parallel是否为此编写工具。
答案 0 :(得分:1)
如果我们假设您受到CPU(而不是内存或I / O)的限制,那么这可能会起作用:
do_jobset() {
jobset=$1
preprocess $jobset
parallel --load 100% do_job ::: $jobset/*
postprocess $jobset
}
export -f do_jobset
parallel do_jobset ::: *.jobset
如果do_job
从一开始就没有使用完整的CPU,但需要10秒钟才能加载要处理的数据,请在--delay 10
之前添加--load 100%
。
另一种方法是:
parallel preprocess ::: *.jobset
parallel do_job ::: jobsets*/*
parallel postprocess ::: *.jobset