如何在Python中为单个函数执行多处理?

时间:2015-04-27 11:27:52

标签: python windows multiprocessing qgis

我正在阅读Python 3的Multiprocessing主题并尝试将该方法合并到我的脚本中,但是我收到以下错误:

  

AttributeError:__ exit __

我使用带有i-7 8核处理器的Windows 7,我有一个大型shapefile,我想要处理(使用映射软件,QGIS),最好使用所有8个核心。以下是我的代码,我非常感谢您对此事的任何帮助:

from multiprocessing import Process, Pool

def f():
    general.runalg("qgis:dissolve", Input, False, 'LAYER_ID', Output)

if __name__ == '__main__':
    with Pool(processes=8) as pool:
        result = pool.apply_async(f)

1 个答案:

答案 0 :(得分:3)

multiprocessing.Pool的上下文管理器功能仅添加到Python 3.3中:

  

3.3版中的新功能:池对象现在支持上下文   管理协议 - 请参阅上下文管理器类型__enter__()返回   池对象和__exit__()调用terminate()

__exit__未定义的事实表明您使用的是3.2或更早版本。您需要在terminate上手动调用Pool以获得相同的行为:

if __name__ == '__main__':
    pool = Pool(processes=8)
    try:
        result = pool.apply_async(f)
    finally:
        pool.terminate()

也就是说,您可能不想在此处使用terminate(或with声明(扩展名)。 __exit__调用Pool的{​​{1}}方法会强行退出您的工作人员,即使他们没有完成他们的工作。您可能希望在退出之前等待工作人员完成,这意味着您应该调用terminate,然后使用close()等待所有工作人员完成,然后退出:

join