多处理包含for循环的python函数

时间:2018-02-26 16:39:55

标签: python-2.7 multiprocessing python-multiprocessing python-multithreading

所以我有一个将XML文件转换为CSV的脚本,这个脚本有一个包含嵌套循环的函数,精确的是juste 2循环:

FichList = [ f for f in os.listdir(FilenamePath) ]

def SplitFichierR50 (l_FichList):
    for filename in FichList:
            if filename.count(".xml") ==1: 
                    print(filename)
                    tree = etree.parse(FilenamePath+"/"+filename)
                    for mes in tree.xpath("/R50/PRM/Donnees_Releve"):
                            l_ID_PRM =mes.getparent()[0]
                            EN_TETE=mes.getparent().getparent()[0]
                            l_ID_FLUX = EN_TETE[0]
                            l_LIB_FLUX = EN_TETE[1]
                            .
                            .
                            .

等...直到拥有所有XML数据并将其写入CSV文件,此脚本工作正常,但我必须优化它的执行以使其更快地工作,所以我使用多处理模块将其添加到脚本:

if __name__ == '__main__':
  jobs = []
  for i in range(10): # I want to use 10 CPUs
  p = multiprocessing.Process(target=SplitFichierR50,args=(FichList,))
  jobs.append(p)
  p.start()

它确实在10个CPU上执行脚本,但它对同一个文件执行相同的操作10次。 enter image description here

在屏幕截图中,我只使用了3个CPU,但我们可以看到它是同一个文件3次。

我想在不同的CPU上执行循环的每个迭代。

请帮助!!

1 个答案:

答案 0 :(得分:0)

这对我来说很难独立测试,但看起来你有一个bug。首先,您的{ "firstName": "John", "lastName": "Doe", "phoneNumbers": "453 123-1234, 753 123-4567" } 函数会接收列表SplitFichierR50,但不会在函数中使用它。实际上,每个进程中的每一个都只是遍历l_FichList中的每个文件。这就是为什么你看到这么多重复的文件处理消息。您需要在FichList中对文件名进行分区,以便每个进程处理一组不同的文件。

例如,像这样:

FichList

确保if __name__ == '__main__': jobs = [] num_processes = 10 step = int(math.ceil(float(len(FichList))/float(num_processes))) for i in range(0, len(FichList), step): p = multiprocessing.Process(target=SplitFichierR50,args=(FichList[i:i+step],)) jobs.append(p) p.start() 并更正import math功能以使用传入的列表。