并行作为作业队列

时间:2017-03-11 17:45:13

标签: parallel-processing gnu-parallel

我有多组作业,并且所有作业都可以并行运行,因此我希望将它们并行化以获得更好的吞吐量。

这就是我目前正在做的事情: 我使用多处理库编写了一个python脚本,同时在一个集合中运行作业。完成一组中的所有作业后,将调用另一组作业(脚本)。这是低效的,因为集合中的每个作业都有不同的执行时间。

最近,我注意到了GNU parallel,我认为它可能有助于改进我的脚本。但是,一组作业具有一些预处理和后处理任务,因此无法运行随机作业。

总之,我想 1)确保在启动作业之前完成预处理 2)在一组中的作业全部完成后运行后处理。

这就是我想要做的事情:

  1. 为每组作业运行单独的脚本。
  2. 在脚本中为每个集合运行预处理,现在可以自由运行所有作业。
  3. 每个脚本在GNU并行中将作业注册到作业队列中。
  4. GNU parallel并行运行队列中的作业。
  5. 每个脚本监视自己的工作是否已完成。
  6. 当一组中的所有作业完成后,运行后处理。
  7. 我想知道如何使用GNU并行执行此类操作,甚至不确定GNU parallel是否为此编写工具。

1 个答案:

答案 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