首页 > 解决方案 > 在 pool.map() 和 pool.join() 的上下文中“阻塞”的真正本质是什么?

问题描述

我正在尝试为自己画一幅如何正确使用Pool对象的图画。

我有一个稍微复杂的任务,但要点是:

def func1(x):
    return x*2

def func2(x):
    return np.sqrt(x)

with Pool(os.cpu_count()) as p:
    x = p.map(func1, range(1000))
    x = p.map(func2, x)

pool.map然后是和的一些文档pool.join

映射(函数,可迭代 [,块大小]):

map() 内置函数的并行等效项(但它仅支持一个可迭代参数,对于多个可迭代对象,请参见 starmap())。它阻塞,直到结果准备好。

加入()

等待工作进程退出。在使用 join() 之前必须调用 close() 或 terminate()。

我对“块”的含义没有很深的理解,但是如果我调用x = p.map(func1, arg)之后y = p.map(func2, x)似乎pool将严格分配给第一个任务直到它完成,然后它将被允许处理下一个任务.

问题一:这种理解正确吗?

如果我的理解是正确的,我似乎不需要使用p.join()它,因为它似乎在做同样的事情(阻止池被使用,直到它完成当前的工作)。

问题 2:我需要使用 p.join() 来完成这样的任务吗?

最后,我看到了 pool.close(),它“防止任何更多的任务被提交到池中。一旦所有任务都完成,工作进程将退出”。没有我告诉怎么能提交更多的任务呢?

问题3:完成所有工作后我需要做任何事情吗,比如 call p.close()

标签: pythonmultiprocessing

解决方案


您可以直接创建进程和池(并手动启动和停止它们),也可以使用with构造(如您所做的那样)以便为您自动处理它。

这应该给您与您的代码相同的结果:

p = Pool(os.cpu_count())
x = p.map(func1, range(1000))
x = p.map(func2, x)
p.close()

推荐阅读