Py学习  »  Python

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

Seung • 7 年前 • 1776 次点击  

蟒蛇 documentation 示例格式为

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

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

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

哪个更可取?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30677
文章 [ 1 ]  |  最新文章 7 年前
Nikolas Stevenson-Molnar
Reply   •   1 楼
Nikolas Stevenson-Molnar    7 年前

我想用 Pool 作为上下文管理器(例如, with ... )是可取的。它是对 游泳池 它可以让你更干净地封装游泳池的寿命。

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

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

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()