我正在阅读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)
答案 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