我有一個很大的dict
類似的對象,需要在衆多工作進程之間共享。每個工作人員讀取對象中信息的隨機子集並對其進行一些計算。我想避免複製大型對象,因爲我的機器快速耗盡內存。多處理 - 共享一個複雜對象
我在玩this SO question的代碼,我修改了一下以便使用固定大小的進程池,這更適合我的用例。然而這似乎打破了它。
from multiprocessing import Process, Pool
from multiprocessing.managers import BaseManager
class numeri(object):
def __init__(self):
self.nl = []
def getLen(self):
return len(self.nl)
def stampa(self):
print self.nl
def appendi(self, x):
self.nl.append(x)
def svuota(self):
for i in range(len(self.nl)):
del self.nl[0]
class numManager(BaseManager):
pass
def produce(listaNumeri):
print 'producing', id(listaNumeri)
return id(listaNumeri)
def main():
numManager.register('numeri', numeri, exposed=['getLen', 'appendi',
'svuota', 'stampa'])
mymanager = numManager()
mymanager.start()
listaNumeri = mymanager.numeri()
print id(listaNumeri)
print '------------ Process'
for i in range(5):
producer = Process(target=produce, args=(listaNumeri,))
producer.start()
producer.join()
print '--------------- Pool'
pool = Pool(processes=1)
for i in range(5):
pool.apply_async(produce, args=(listaNumeri,)).get()
if __name__ == '__main__':
main()
輸出是
4315705168
------------ Process
producing 4315705168
producing 4315705168
producing 4315705168
producing 4315705168
producing 4315705168
--------------- Pool
producing 4299771152
producing 4315861712
producing 4299771152
producing 4315861712
producing 4299771152
正如你所看到的,在第一種情況下的所有工作進程得到相同的對象(通過ID)。在第二種情況下,id不一樣。這是否意味着對象被複制?
P.S.我不認爲事情,但我使用joblib
,其內部使用的一個Pool
:
from joblib import delayed, Parallel
print '------------- Joblib'
Parallel(n_jobs=4)(delayed(produce)(listaNumeri) for i in range(5))
,輸出:
------------- Joblib
producing 4315862096
producing 4315862288
producing 4315862480
producing 4315862672
producing 4315862352
檢查http://zeromq.org/,它使得以簡單的方式在進程之間共享信息。 – clopez