如何根据工作人员结果向正在运行的多处理池中添加其他任务?

时间:2019-01-24 16:59:07

标签: python multiprocessing python-multiprocessing

说我有一组20个CPU繁重的任务(每个〜1小时,但是有些花费更长的时间),这些任务是通过例如Pool.apply_async(function, task_list)等。PC有12个核心。这样我就可以分散负载,并使用全部12个内核。

每个任务的结果可能要求必须运行一个新任务(某些任务可能需要运行1次,其他任务可能需要运行10个)。

当需要一项新任务时,我想将该任务派生到现有的池task_list中,以便始终优化CPU使用率。

当前,我运行20个任务,等待完成,开始新的〜18个任务,等待完成,开始其余的新任务,.....,虽然发生了一个小时仅使用1个核的情况,之12。这将导致计算时间损失数小时到数天。我可以在同一个工作线程中运行更新后的任务,但这会导致更大的损失)

使用池似乎无法在启动时向池添加更多任务。这是正确的吗?还是有一些聪明的方法可以让我在整个地方搜索时错过这一点?

(我看到的唯一选择是使用process而不是pool,并在动态列表上进行while循环,该动态列表以单个进程的形式启动典型任务,同时最多允许12个进程同时运行,对于每个任务或新任务,将它们放入动态列表中,并在将其发送到进程时将其删除。)

1 个答案:

答案 0 :(得分:2)

您可以使用队列,您可以在此处查看示例: https://www.journaldev.com/15631/python-multiprocessing-example 这样,您就可以添加到队列中,并从队列中提取恒定数量的跑步者。