将Python池与上下文管理器一起使用或关闭并加入

问题描述 投票:2回答:1

Python documentation的格式为例子

with Pool() as p:
    p.map(do)

但我看到很多人使用下面的格式。

p = Pool()
p.map(do)
p.close()
p.join()

哪个更理想?

python pool
1个回答
3
投票

我认为使用Pool作为上下文管理器(例如,with ...)是可取的。它是Pool的新增功能,它可以让您更清晰地封装池的生命周期。

需要注意的一点是,当上下文管理器退出时,它将终止池​​和任何正在进行的任务。这意味着你仍然想在某些情况下做p.join()。您的示例不需要这样,因为p.map将阻止执行,直到任务完成为止:

map()内置函数的并行等价物(它只支持一个可迭代的参数)。它会阻塞,直到结果准备就绪。

https://docs.python.org/3.7/library/multiprocessing.html#multiprocessing.pool.Pool.map

因此,在第二个示例中,对.join().close()的调用是冗余的,因为任务已完成,并且不会运行任何其他任务。

但是,使用.map_async会使.join有用:

with Pool() as p:
    p.map_async(do_something, range(100))
    # Do something else while tasks are running
    p.join()
© www.soinside.com 2019 - 2024. All rights reserved.