我正在使用Python multiprocessing module,并且正在寻找一种在构建流程时附加只读数据的方法。我希望这些数据能够在多个作业中持续存在。
我计划将Process子类化并将数据附加到类中,如下所示:
import multiprocessing
class Worker(multiprocessing.Process):
_lotsofdata = LotsOfDataHolder()
def run(self, arg):
do something with _lotsofdata
return value
if __name__ == '__main__':
jobs = []
for i in range(5):
p = Worker()
jobs.append(p)
p.start()
for j in jobs:
j.join()
但是,作业的数量大约是500k,所以我宁愿使用Pool构造,也没有办法告诉Pool使用进程的子类。
有没有办法告诉Pool使用Process的子类,还是有另一种方法可以将数据保存在worker上,以用于与Pool一起工作的多个作业?
注意:有解释here,但没有具体讨论子类化过程。
*我现在看到args被传递给进程构造函数。这使我的方法更加不可能。
答案 0 :(得分:1)
作为explained in this answer,多个进程不会共享相同的内存空间。这使得persist data on a worker for multiple jobs
之类的陈述毫无意义:工人无法访问任何其他工人的数据。
这种情况会自动发生:
import multiprocessing
_lotsofdata = [0]*1000
def run(arg):
return arg+_lotsofdata[0]
pool= multiprocessing.Pool()
l=[1,2,3]
print pool.map(run, l)
如果您不想复制内存,那么您就可以实现自己的(依赖于操作系统)机制来在进程之间共享状态。联系答案中列出了几种方法。
实际上,除非您尝试在具有数十个CPU的群集上进行超级计算,否则在走这条路之前我会三思而行。