gpt4 book ai didi

python - 最后尝试 vs :with pool as"

转载 作者:太空宇宙 更新时间:2023-11-04 11:12:04 25 4
gpt4 key购买 nike

这两个 block 在功能上是否相同,尤其是在正确关闭连接的情况下?

Try-finally block :

from multiprocessing import Pool

def fun_parallel(processes=4):
try:
pool = Pool(processes=processes)
results = [pool.apply_async(SOMEFUNCTION, iter_item) for iter_item in SOMELIST]
results_list = [r.get() for r in results]
return results_list
finally:
pool.close()
pool.join()

对比

带池 block :

from multiprocessing import Pool

def fun_parallel(processes=4):
with Pool(processes=processes) as p:
results = [p.apply_async(SOMEFUNCTION, iter_item) for iter_item in SOMELIST]
results_list = [r.get() for r in results]
return results_list

最佳答案

它们并不等价,但只有在出现异常时才有意义。

使用池对象作为上下文管理器将导致 Pool.terminate() method在退出时被调用。来自Process Pools documentation :

Pool objects now support the context management protocol [...] __enter__() returns the pool object, and __exit__() calls terminate().

Pool.terminate() 立即结束所有子进程,无需等待工作完成。

您使用什么取决于您的应用程序。如果出现异常,上下文管理器只会在工作完成之前退出。在传播异常之前,您的版本首先等待其他工作完成

因为您是在列表理解中收集已完成的工作,所以如果没有出现异常,您将看不到行为上的差异。但是,终止可能比关闭和加入快一点。这两种方法都会正确关闭连接。

关于python - 最后尝试 vs :with pool as",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57963422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com