Вам нужно использовать управляемые списки, если вы хотите, чтобы изменения были отражены. Итак, для меня работает следующее:
from multiprocessing import *
def mapTo(d,tree):
for idx, item in enumerate(list(d), start=1):
tree[str(item)].append(idx)
if __name__ == '__main__':
data=[1,2,3,1,3,1]
with Pool(processes=3) as pool:
manager = Manager()
sharedtree= manager.dict({"1":manager.list(), "2":manager.list(),"3":manager.list()})
pool.starmap(mapTo, [(data,sharedtree ) for _ in range(3)])
print({k:list(v) for k,v in sharedtree.items()})
Это вывод:
{'1': [1, 1, 1, 4, 4, 4, 6, 6, 6], '2': [2, 2, 2], '3': [3, 3, 5, 3, 5, 5]}
Обратите внимание, вы всегда должны использовать защиту if __name__ == '__main__':
при использовании многопроцессорной обработки, также избегайте помеченных звездочкой import ...
Edit
Вы должны выполнить это переназначение, если вы используете Python <3.6, поэтому используйте это для <code>mapTo:
def mapTo(d,tree):
for idx, item in enumerate(list(d), start=1):
l = tree[str(item)]
l.append(idx)
tree[str(item)] = l
И, наконец, вы не используете starmap
/ map
правильно, вы передаете данные три раза, поэтому, конечно, все подсчитывается три раза. Операция сопоставления должна работать с каждым отдельным элементом данных, которые вы отображаете, поэтому вам нужно что-то вроде:
from functools import partial
from multiprocessing import *
def mapTo(i_d,tree):
idx,item = i_d
l = tree[str(item)]
l.append(idx)
tree[str(item)] = l
if __name__ == '__main__':
data=[1,2,3,1,3,1]
with Pool(processes=3) as pool:
manager = Manager()
sharedtree= manager.dict({"1":manager.list(), "2":manager.list(),"3":manager.list()})
pool.map(partial(mapTo, tree=sharedtree), list(enumerate(data, start=1)))
print({k:list(v) for k,v in sharedtree.items()})