我正在尝试让 multiprocessing.Pool
方法工作。它启动并显示所有核心都处于事件状态,尽管最终只是停止而没有完成。
为了解决这个问题,我首先尝试使用一个简单的 for
循环并且成功了(下面的方法 1)。我还尝试使用 multiprocessing.Process
方法,该方法也有效(下面的方法 2)。
但是,方法 3(如下)只是挂起。我在实现 multiprocessing.Pool
方法时哪里可能出错?
import arcpy, os, glob, multiprocessing
# Method 1 works
inws = r'C:\temp\raster_data'
rasters = glob.glob(os.path.join(inws, "*.tif"))
def worker(raster):
arcpy.arcpy.BuildRasterAttributeTable_management(raster)
arcpy.AddField_management(raster, "Cover", "TEXT", "", "", 20)
for raster in rasters:
worker(raster)
# Method 2 works
def mp_worker(raster):
arcpy.arcpy.BuildRasterAttributeTable_management(raster)
arcpy.AddField_management(raster, "Cover", "TEXT", "", "", 20)
if __name__ == '__main__':
inws = r'C:\temp\raster_data'
rasters = glob.glob(os.path.join(inws, "*.tif"))
for raster in rasters:
p = multiprocessing.Process(target=mp_worker(raster))
p.start()
p.join()
# Method 3 not working
def mp_worker(raster):
arcpy.arcpy.BuildRasterAttributeTable_management(raster)
arcpy.AddField_management(raster, "Cover", "TEXT", "", "", 20)
def mp_handler():
p = multiprocessing.Pool(8)
p.map(mp_worker, rasters)
if __name__ == '__main__':
inws = r'C:\temp\raster_data'
rasters = glob.glob(os.path.join(inws, "*.tif"))
mp_handler()
最佳答案
这一行
p = multiprocessing.Process(target=mp_worker(raster))
应该是这样的
p = multiprocessing.Process(target=mp_worker, args=(raster,))
否则,您在应该引用函数 mp_worker
时调用它。
关于windows - 多处理池方法挂起但处理方法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38418013/