并行化这种Python结构的正确方法

时间:2017-04-28 07:37:30

标签: python parallel-processing multiprocessing

我在Python中编写了一些代码,并希望通过在不同进程之间共享来加快速度。我在Linux上的Python 3.5中有以下程序子结构:

class Foo(fromMother):

   def __init__(self, size):
      fromMother.__init__()
      self.data = self.__createData(size)
      self.properGuess = 0

   def __createData(self, size):
      """Returns some dict of n x m numpy arrays."""

   def doStuff(self, level):
      """Calculates CPU-heavy, fully serial operation.
        The proper guess is some sort of start value."""
      a, b = foo(level, self.properGuess)
      self.properGuess = a
      return b



if __name__ == "__main__":
   foo = Foo(someSize)
   array = []
   for i in range(manyValues):
       array.append(foo.doStuff(i))

这与我的代码非常相似,我希望找到一种很好的方法来引入一些并行结构来使用多个内核。 doStuff()不能并行化并且是某种优化问题,因此是起始值。这是绝对最新的值并不是必要的,该功能在步骤i中仍然可以很好地执行,起点在i - 10处计算,所以现在可以更新这个值了吗?然后'。但它不能被忽略,步骤i + 1的值接近于i,我知道问题不是全局的,而只是局部凸起的。保持这种接近使我获得了相当稳定的结果。

不幸的是,破坏继承结构会非常烦人 - 这是可能的,但应该是最后的手段。我想使用Python自己的多处理库,但我对共享内存等有点困惑,因为这不是简单地共享某种类型的数组,而是将它放在一个对象中并使用它上面的方法。我只在MATLAB上完成了并行编程,这只是在一个非常基础的层面上。

有人能指出我的方法吗?我已经两天思考这个问题,而且我不确定如何在不破坏的情况下很好地实现这一目标并且" uglyfying"我的整个结构。

1 个答案:

答案 0 :(得分:0)

您可以使用流程池

from multiprocessing import Pool

if __name__ == "__main__":
   foo = Foo(someSize)
   p = Pool(5)
   results = p.map(foo.doStuff, range(manyValues))

但是,你需要首先考虑一些事情,你的班级是否可以共享?它会变异吗?等等......