并行处理Python中不同类的对象

时间:2016-01-15 13:05:19

标签: python python-multithreading

我有6个不同的班级。

主要是,我正在创建每个类的一个对象。

我想平行地呼叫每个对象的eachObject.processFiles()

processFiles方法通过读取目标文件,处理数据并将其保存在持久对象中来处理目标文件。每个processFiles调用大约需要5分钟。如果顺序完成,那么主要花费大约30分钟。

我现在正在按顺序进行,但我想加快6个对象的速度。在最短的CPU时间内处理他们的文件。所有对象都是相互独立的,我认为多线程方式是有效的。但我以前从未做过多线程。所以想知道这样做是否安全,以及如何做到这一点。代码片段会有所帮助。

我该如何并行完成?

class system(object):
  def __init__(self, leNameList):
    self.files = fileNameList

  def processFiles(self):
    self.feeds= self.readFiles()
    self.processFeeds()

class A(system):
  def processFeeds(self):
    """ process the feed 
         in A way """

class B(system):
  def processFeeds(self):
    """ process the feed 
         in B way """

def main():
  aObj = A(fileList)
  bObj = B(fileList2)
  aObj.processFiles()
  bObj.processFiles() 

1 个答案:

答案 0 :(得分:0)

使用multiprocessing模块。

Foo

在这里,我使用示例数据填充了您的代码,以便您可以开箱即用来测试此解决方案,但其主旨是:

  • 不是更改全局变量或对象状态,而是返回您生成的数据。
  • 使用import multiprocessing class system(object): def __init__(self, fileNameList): self.files = fileNameList def processFiles(self): # self.feeds= self.readFiles() return self.processFeeds() class A(system): def processFeeds(self): return ["A feed", "example data"] + self.files class B(system): def processFeeds(self): return ["B feed", "hello world"] + self.files def process_file_task(processor): return processor.processFiles() def main(): aObj = A(["a"]) bObj = B(["b"]) data = multiprocessing.Pool().map(process_file_task, [aObj, bObj]) print(data) 执行不同进程中的函数,并按顺序返回每个结果。

这样做的缺点是multiprocessing.Pool().map有时可能有点挑剔,你必须确保所有通过过程边界的东西都可以被腌制。

检查代码还有一件事是文件列表。如果它们有很多共同的文件,你应该将文件读出的过程分开,并确保不必读取同一个文件两次。