pool.map()如何在内部分配工作



我是multiprocessing库的新手,并在与map()一起使用时就其Pool模块有疑问。假设我有4个工作线程和6个任务要完成。我要做的是(使用multiprocessing.dummy,因为我想产生线程而不是处理)

from multiprocessing.dummy import Pool as ThreadPool
def print_it(num):
    print num
def multi_threaded():
    tasks = [1, 2, 3, 4, 5, 6]
    pool = ThreadPool(4)
    r = pool.map(print_it, tasks)
    pool.close()
    pool.join()
multi_threaded()

我想了解pool.map()如何处理任务?三个选项:

  1. 它是否首先衍生4个线程,完成第一个4个任务,然后让线程死亡。然后为其余任务产生2个新线程吗?
  2. 它是否产生了4个线程,将4个任务分配给它们,一旦某些线程完成其任务,请将新任务分配给同一线程。
  3. 其他方式。

这种见解会有所帮助,因为它将帮助我考虑在产品中更有效地使用Pool.map()

这取决于您如何定义池。

在您的示例中,您的(2)发生了。您的线程或进程取决于池的不同,一旦您初始化池(发生在Pool__init__()中 - 无需提交任务以实现这一目标),他们坐在那里等待任务。当任务到达并执行时,线程或进程不会退出,他们只是回到等待状态等待更多工作。

但是,您可以定义其工作方式不同。您可以在池中添加maxtasksperchild参数。一旦工人完成了这项任务,它就会退出,并立即启动新的工人(无需首先给它一个任务,工人退出后就会立即启动)。这是在池类Pool._maintain_pool()Pool._repopulate_pool()功能中进行管理的。

如果您希望您的工人在开始并无限期地运行,请执行您现在做的事情,这就是发生的事情。如果您希望您的工人在开始时启动,但要在多个任务后退出并更新自己(即使是必要的),请使用maxtasksperchild。如果您不想在需要之前启动过程或线程,请不要使用池。当您需要并自己管理它们时,启动线程或流程。

希望这会有所帮助。

最新更新