Мне нужен доступ к элементам списка из процессов, порожденных многопроцессорной библиотекой. Однако я читал, что иметь общую структуру данных между процессами - плохая идея, но я не уверен, как еще решить эту проблему. Список содержит переменные счетчика, к которым каждая из сторон должна получить доступ. Переменные счетчика в списке должны увеличиваться циклами внутри каждого процесса. Я ищу альтернативу созданию общих списков между процессами. Я безуспешно пытался создать общий список между процессами, показанными в коде ниже. Любые альтернативные методы / помощь с ошибками будут оценены.
with Manager() as manager:
aout_stable = manager.list([0]*len(aout))
def calculate(ain_index_):
ainn= ain[ain_index_]
for parameters in itertools.product(aout,qoutlist,samples_eccentricities):
#Finding index for which counter variable to increment within list
aout_index = np.where(aout==parameters[0])[0][0]
a_ratio = parameters[0]/ainn
inclination_limit = (math.pi/0.3)*(1-a_ratio/((( (1+parameters[1])*(1+parameters[2])/(np.sqrt(1-parameters[2]) ))**(2./5.) )*(2.8/(1-parameters[2]))))
stable_num = len(np.where(inclinations>inclination_limit)[0])
aout_stable[aout_index] += stable_num
pool = multiprocessing.Pool(processes=20)
ain_index = [i for i in range(len(ain))]
result = pool.map(calculate,ain_index)
Ошибка, возвращаемая неудачным кодом:
Traceback (most recent call last):
File "itertools test.py", line 82, in <module>
result = pool.map(calculate,ain_index)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/lib/python2.7/multiprocessing/pool.py", line 558, in get
raise self._value
socket.error: [Errno 2] No such file or directory
Просто запуск функции вычисления над одним элементом массива ain вместо всего массива приводит к следующей ошибке:
File "itertools test.py", line 80, in <module>
x = calculate(1)
File "itertools test.py", line 71, in calculate
aout_stable[aout_index] += stable_num
File "<string>", line 2, in __getitem__
File "/usr/lib/python2.7/multiprocessing/managers.py", line 755, in _callmethod
self._connect()
File "/usr/lib/python2.7/multiprocessing/managers.py", line 742, in _connect
conn = self._Client(self._token.address, authkey=self._authkey)
File "/usr/lib/python2.7/multiprocessing/connection.py", line 169, in Client
c = SocketClient(address)
File "/usr/lib/python2.7/multiprocessing/connection.py", line 304, in SocketClient
s.connect(address)
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 2] No such file or directory