【问题标题】:Multiprocessing Pool method hanging but Process method working多处理池方法挂起但处理方法工作
【发布时间】:2016-11-19 22:57:54
【问题描述】:

我正在尝试使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() 

【问题讨论】:

  • 我不确定它是否与您遇到的问题有关,但您的“方法 2”代码不会进行任何并行处理,因为您在开始之前 joining 每个进程下一个。要使其并行运行,您需要在单独的循环中执行 join 调用。

标签: windows python-2.7 multiprocessing python-multiprocessing pool


【解决方案1】:

这一行

p = multiprocessing.Process(target=mp_worker(raster))

应该是这样的

p = multiprocessing.Process(target=mp_worker, args=(raster,))

否则,您在应该有对它的引用时调用函数mp_worker

【讨论】:

    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多