параллельная карта python (multiprocessing.Pool.map) с глобальными данными - PullRequest
11 голосов
/ 28 марта 2012

Я пытаюсь вызвать функцию для нескольких процессов. Очевидное решение - модуль Python multiprocessing. Проблема в том, что функция имеет побочные эффекты. Он создает временный файл и регистрирует этот файл для удаления при выходе, используя atexit.register и глобальный список. Следующее должно продемонстрировать проблему (в другом контексте).

import multiprocessing as multi

glob_data=[]
def func(a):
    glob_data.append(a)

map(func,range(10))
print glob_data  #[0,1,2,3,4 ... , 9]  Good.

p=multi.Pool(processes=8)
p.map(func,range(80))

print glob_data  #[0,1,2,3,4, ... , 9] Bad, glob_data wasn't updated.

Есть ли способ обновить глобальные данные?

Обратите внимание, что если вы попробуете приведенный выше скрипт, вам, вероятно, не стоит пробовать его из интерактивного интерпретатора, поскольку multiprocessing требует, чтобы модуль __main__ был импортирован дочерними процессами.

UPDATE

Добавлено ключевое слово global в func, не помогает - например ::

def func(a):  #Still doesn't work.
    global glob_data
    glob_data.append(a)

Ответы [ 2 ]

19 голосов
/ 28 марта 2012

Вам нужен список glob_data, который будет поддерживаться разделяемой памятью, Multiprocessing's Manager дает вам только это:

import multiprocessing as multi
from multiprocessing import Manager

manager = Manager()

glob_data = manager.list([])

def func(a):
    glob_data.append(a)

map(func,range(10))
print glob_data  # [0,1,2,3,4 ... , 9] Good.

p = multi.Pool(processes=8)
p.map(func,range(80))

print glob_data # Super Good.

Для некоторого фона:

https://docs.python.org/3/library/multiprocessing.html#managers

1 голос
/ 28 марта 2012

Пусть func вернет кортеж с результатами, которые вы хотите получить от обработки, и тем, что вы хотите добавить к glob_data.Затем, когда файл p.map завершен, вы можете извлечь результаты из первых элементов в возвращенных кортежах и построить glob_data из вторых элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...