【问题标题】:Try-finally vs :with pool as"Try-finally vs :with pool as"
【发布时间】:2019-09-16 19:40:29
【问题描述】:

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

try-finally 块:

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

带池块:

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

【问题讨论】:

    标签: python python-3.x python-multiprocessing


    【解决方案1】:

    它们不是等价的,但只有出现异常时才重要。

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

    池对象现在支持上下文管理协议 [...] __enter__() 返回池对象,__exit__() 调用 terminate()

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 2023-03-09
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 2018-03-19
      相关资源
      最近更新 更多