Многопроцессорность Python делится внутри класса

Я хочу понять, как многопроцессор и менеджер работают для обмена памятью

У меня есть класс со словарем, созданным на классе. init Я хочу использовать многопроцессорную обработку, чтобы вызвать функцию класса, которая заполняет словарь (каждый процесс добавляет другой ключ).

import multiprocessing as mp from multiprocessing import Process, Manager class num: def __init__(self): manager = Manager() d = manager.dict() # Setup list of processes processes = [mp.Process(target=self.f, args=(d,i)) for i in range(5)] #Run processes for p in processes: p.start() #Exit the completed processes for p in processes: p.join() print d def f(self,d,i): d[str(i)] = [] d[str(i)].append(i) if __name__ == '__main__': test = num() 

результат:

 {'1': [], '0': [], '3': [], '2': [], '4': []} 

Список внутри f () также должен быть разделен? Как и почему?

Вам нужно изменить строку в функции f :

 d['i'] = [i] 

к чему-то вроде

 d[str(i)] = i 

так что ваши процессы не перезаписывают записи друг друга в shared dict. После этого он отлично работает для меня (в Python 2.7.3), распечатывая

 {'1': 1, '0': 0, '3': 3, '2': 2, '4': 4} 

(Кроме того, в коде, который вы опубликовали, отсутствует import multiprocessing as mp )

Обновление : если вы просто хотите, чтобы значения в shared dict были списками, то это простое изменение, например

 d[str(i)] = [i] 

Если вы хотите, чтобы каждый из списков был общим для всех процессов, вам, вероятно, необходимо создать эти списки в основном процессе, используя manager.list() и передать их всем подпроцессам, например:

  count = 5 lists = [manager.list() for i in range(count)] for i in range(count): d[i] = lists[i] processes = [mp.Process(target=self.f, args=(d,i, lists)) for i in range(count)] 

[…]

 def f(self,d,i, lists): for j in range(i): # just an example to show lists[j].append(i) # that the lists are shared between processes 

Я также попытался напрямую вложить управляемые списки внутри управляемого dict, но по какой-то причине это не сработало, и подпроцессы не смогли обновить списки. Передача их отдельно, как показано, кажется, работает, например, я могу получить каждый подпроцесс для обновления нескольких списков:

 {0: [1, 2, 3, 4], 1: [2, 3, 4], 2: [3, 4], 3: [4], 4: []} 

замена:

 d[str(i)].append(i) 

с:

 d[str(i)] += [i] 

решать проблему.

Результат:

 {'1': [1], '0': [0], '3': [3], '2': [2], '4': [4]} 

Но я действительно хочу знать, почему.