python - 在 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()
?
解决方案
您可以直接创建进程和池(并手动启动和停止它们),也可以使用with
构造(如您所做的那样)以便为您自动处理它。
这应该给您与您的代码相同的结果:
p = Pool(os.cpu_count())
x = p.map(func1, range(1000))
x = p.map(func2, x)
p.close()
推荐阅读
- laravel - 服务器上的 Laravel 与 ip
- android - 如何在android中设置进度条0
- python - hello_world() 缺少 1 个必需的位置参数:“请求”
- jsf - 如何在选中元素的情况下呈现 selectManyCheckbox?
- python - Python lambda 函数是否有助于减少执行时间?
- java - 异常处理模板“searchresult”
- java - PKIX 路径构建失败:
- scenekit - [addressX] 处的 SCNParticleSystem 弱变量持有 [addressY]
- laravel - 登录 Laravel 时登录另一个关联帐户
- php - What's the RegEx pattern to get recursive bracket with specific prefix?