繁体   English   中英

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

[英]Use Python Pool with context manager or close and join

Python文档的示例格式为

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

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

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

哪个更受欢迎?

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

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

map() 内置函数的并行等效项(尽管它仅支持一个可迭代参数)。 它阻塞直到结果准备好。

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

因此,在第二个示例中,对.join()的调用是不必要的,因为.map()将阻塞,直到所有任务完成。

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

with Pool() as p:
    p.map_async(do_something, range(100))
    # Do something else while tasks are running
    p.close()
    p.join()

编辑:正如 Facundo Olano 指出的那样, .close()必须始终在.join()之前调用,如文档中所述:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM