我有一个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中执行此操作?
答案 0 :(得分:1)
假设我们正在谈论CPython ......
如果你可以在知道如何产生GIL的numpy
之类的Python扩展中进行计算工作,那么使用线程(如同建议的那样)将会运行良好。
否则,在POSIX系统上,您可以multiprocessing
使用fork
但不使用exec
,从而在理论上避免物理使用COW分叉复制数据。但是,正常Python代码执行的引用计数的不断摆弄逐渐打破了OS在进程副本之间的共享。即使在每个过程结束时重新分配数据也可以轻松地释放所需的内存。但是如果您有大型对象(如长字符串)而不是许多对象(如长列表),那么它可能没问题。