通过Python多处理器进程子类在作业中持久化只读数据



我正在使用Python多处理模块,并正在寻找一种在构建进程时附加只读数据一次的方法。我希望这些数据能在多个作业中持续存在。

我计划将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的子类,或者有没有另一种方法来为使用Pool的多个作业持久化worker上的数据?

注意:这里有一些解释,但并没有具体讨论子类化过程。

*现在我看到args被传递给了流程构造函数。这让我的做法更加不可能。

如本答案所述,多个进程不共享相同的内存空间。这使得像persist data on a worker for multiple jobs这样的语句变得毫无意义:工作人员无法访问任何其他工作人员的数据。

多处理所能做的是通过worker复制相同的初始数据。这会自动神奇地发生:

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的集群上进行超级计算,否则我会三思而后行。

最新更新