社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Seung • 5 年前 • 1014 次点击  

蟒蛇 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
 
1014 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Nikolas Stevenson-Molnar
Reply   •   1 楼
Nikolas Stevenson-Molnar    5 年前

我想用 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()