通过Python多处理流程子类保持对作业的只读数据

时间:2015-02-04 14:23:45

标签: python multiprocessing python-multiprocessing

我正在使用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被传递给进程构造函数。这使我的方法更加不可能。

1 个答案:

答案 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的群集上进行超级计算,否则在走这条路之前我会三思而行。