我是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()如何处理任务?三个选项:
- 它是否首先衍生4个线程,完成第一个4个任务,然后让线程死亡。然后为其余任务产生2个新线程吗?
- 它是否产生了4个线程,将4个任务分配给它们,一旦某些线程完成其任务,请将新任务分配给同一线程。
- 其他方式。
这种见解会有所帮助,因为它将帮助我考虑在产品中更有效地使用Pool.map()
。
这取决于您如何定义池。
在您的示例中,您的(2)发生了。您的线程或进程取决于池的不同,一旦您初始化池(发生在Pool__init__()
中 - 无需提交任务以实现这一目标),他们坐在那里等待任务。当任务到达并执行时,线程或进程不会退出,他们只是回到等待状态等待更多工作。
但是,您可以定义其工作方式不同。您可以在池中添加maxtasksperchild
参数。一旦工人完成了这项任务,它就会退出,并立即启动新的工人(无需首先给它一个任务,工人退出后就会立即启动)。这是在池类Pool._maintain_pool()
和Pool._repopulate_pool()
功能中进行管理的。
如果您希望您的工人在开始并无限期地运行,请执行您现在做的事情,这就是发生的事情。如果您希望您的工人在开始时启动,但要在多个任务后退出并更新自己(即使是必要的),请使用maxtasksperchild
。如果您不想在需要之前启动过程或线程,请不要使用池。当您需要并自己管理它们时,启动线程或流程。
希望这会有所帮助。