Альтернативы общему списку между потоками (многопроцессорная обработка) - PullRequest
1 голос
/ 08 июля 2019

Мне нужен доступ к элементам списка из процессов, порожденных многопроцессорной библиотекой. Однако я читал, что иметь общую структуру данных между процессами - плохая идея, но я не уверен, как еще решить эту проблему. Список содержит переменные счетчика, к которым каждая из сторон должна получить доступ. Переменные счетчика в списке должны увеличиваться циклами внутри каждого процесса. Я ищу альтернативу созданию общих списков между процессами. Я безуспешно пытался создать общий список между процессами, показанными в коде ниже. Любые альтернативные методы / помощь с ошибками будут оценены.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...