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