在类中的进程/线程之间共享非常大的对象?

时间:2018-01-26 05:08:50

标签: python multithreading parallel-processing shared-memory

我有一个Python类,我想在其中生成线程或进程来共享数据,而不是在线程或衍生进程中复制它们。这是我想要做的事情的抽象。

class ClassA(object):
  def work(self, bigDictionary, bigList):
      param1 = self.getDictParam(bigDictionary)
      param2 = self.getListParam(bigList)
      return self.someOtherWork(param1, param2)

  def parallelizeWork(self, listOfBigDictionaries, listOfBigLists):
      result = # PARALLEL WORK ON EACH PAIR OF DICTIONARY AND LIST
      return result

你可以意识到我的任务(处理器绑定)是令人尴尬的并行,我尝试了多处理。不幸的是,因为我传递的物体很大,它们会引发酸洗错误。我真的不希望进程或线程复制数据,因为work并且它调用的函数不会修改任何对象;相反,我会让他们只是从对象中读取。有没有正确的方法在Python中执行此操作?

1 个答案:

答案 0 :(得分:1)

假设我们正在谈论CPython ......

如果你可以在知道如何产生GIL的numpy之类的Python扩展中进行计算工作,那么使用线程(如同建议的那样)将会运行良好。

否则,在POSIX系统上,您可以multiprocessing使用fork但不使用exec,从而在理论上避免物理使用COW分叉复制数据。但是,正常Python代码执行的引用计数的不断摆弄逐渐打破了OS在进程副本之间的共享。即使在每个过程结束时重新分配数据也可以轻松地释放所需的内存。但是如果您有大型对象(如长字符串)而不是许多对象(如长列表),那么它可能没问题。