【问题标题】:Multiprocessing a python function that contains a for loop多处理一个包含for循环的python函数
【发布时间】:2018-08-06 04:18:46
【问题描述】:

所以我有一个将 XML 文件转换为 CSV 的脚本,这个脚本有一个包含嵌套循环的函数,准确地说是 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 次相同的操作。

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

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

请帮忙!!

【问题讨论】:

  • 请修正缩进。
  • @ikac 你是什么意思?

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


【解决方案1】:

这对我来说很难独立测试,但看起来你有一个错误。首先,您的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 并更正SplitFichierR50 函数以使用传入的列表。

【讨论】:

  • 谢谢你的回答但结果没有改变,我还是同样的行10次。
猜你喜欢
  • 2013-12-10
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
相关资源
最近更新 更多