У меня есть большой объект dict
, который нужно разделить между несколькими рабочими процессами. Каждый работник считывает случайное подмножество информации в объекте и выполняет некоторые вычисления с ним. Я бы хотел избежать копирования большого объекта, так как моя машина быстро исчерпала память.
Я играл с кодом для этого вопроса SO и немного изменил его, чтобы использовать пул процессов фиксированного размера, который лучше подходит для моего использования, Однако это, похоже, нарушает его.
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). Во втором случае идентификатор не совпадает. Означает ли это, что объект копируется?
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