如何使用Python Multiprocessing传递多个值

时间:2015-06-24 20:14:46

标签: python multiprocessing arcmap

我有一个脚本,它将运行我们公司范围内的部分网络,以便在更新时替换数据。问题是我有数百条路径并且在没有多处理的情况下运行它需要整个周末。在过去,我已将类似的脚本分解为子文件夹,但它需要持续监视并在整个周末运行连续的文件夹。

mappaths是一个包含路径的元组

def UpdateLayers(maps, oldNames, newLayer0, newLayer1, newLayer2, newLayer3, newLayer4, f):
    mxd = arcpy.mapping.MapDocument(maps)
    print maps
    for df in arcpy.mapping.ListDataFrames(mxd):
        for layer in arcpy.mapping.ListLayers(mxd, "", df):
            #Land Survey Base
            if layer.name in oldNames:
                if layer.name == oldNames[0]:
                    LayerReplace(layer, newLayer0, df, f, maps)
                elif layer.name == oldNames[1]:
                    LayerReplace(layer, newLayer1, df, f, maps)
                elif layer.name == oldNames[2]:
                    LayerReplace(layer, newLayer2, df, f, maps)
                elif layer.name == oldNames[3]:
                    LayerReplace(layer, newLayer3, df, f, maps)
                elif layer.name == oldNames[4]:
                    LayerReplace(layer, newLayer4, df, f, maps)
                else:
                    print "layer unable to replace"
    SaveMXD(f, mxd, maps)
    del mxd

##some more code

for maps in mappaths:
    UpdateLayers(maps, oldNames, newLayer0, newLayer1, newLayer2, newLayer3, newLayer4, f)

从我在这里读到的,在某些时候我想用类似于

的东西替换我的for循环
if __name__ == '__main__':
    p = multiprocessing.Pool()
    p.map(UpdateLayers, mappaths)

我的问题是我不知道如何将oldNames, newLayer0, newLayer1, newLayer2, newLayer3, newLayer4, f传递给我的函数。

我认为我所缺少的内容相当简单,但编程和脚本编写是我工作的另一部分,因为我通常可以解决这个问题。

1 个答案:

答案 0 :(得分:0)

来自文档:

  

map(func,iterable [,chunksize])map()的并行等价物   内置函数(它只支持一个可迭代的参数)。

因此,您必须将8个参数放入单个列表中,将其传递给UpdateLayers,然后从函数中的该列表中获取所有参数。

您的电话将如下:

p.map(UpdateLayers, [maps, oldNames, newLayer0, newLayer1, newLayer2, newLayer3, newLayer4, f])