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

时间:2017-09-22 09:19:11

标签: python threadpool python-multiprocessing

我对multiprocessing库不熟悉,并且在与Pool一起使用时对map()模块有疑问。假设我有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. 其他方式。
  4. 这种见解会有所帮助,因为它可以帮助我更好地考虑在生产中使用Pool.map()

1 个答案:

答案 0 :(得分:1)

这取决于您如何定义池。

正如你在你的例子中所做的那样,你的(2)发生了。初始化池时,您的线程或进程取决于池的启动(在Pool__init__()中发生 - 无需提交任务以实现此目的)并且他们坐在那里等待任务。当任务到达并执行时,线程或进程不会退出,它们只会返回等待状态,等待更多工作的到来。

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

如果您希望您的工作人员在开始时无限期地启动并执行您现在所做的事情,那么就会发生这种情况。如果您希望您的工作人员在开始时启动但在许多任务(甚至必要时)之后退出并自行更新,请使用maxtasksperchild。如果您不想在需要之前启动进程或线程,请不要使用Pool。在需要时启动线程或进程并自行管理它们。

希望这会有所帮助。