Проблема в том, что вы используете объект multiprocessing.Manager для совместного использования данных между процессами, но вы не правильно обрабатываете результаты.
Вместо использования словаря outcomes, вы должны вернуть результаты из функции reader и обрабатывать их в основном процессе. Например, вы можете использовать метод Pool.map вместо Pool.starmap, который автоматически соберет результаты из каждого процесса в итераторе. Затем вы можете пройти по этому итератору и добавить элементы в словарь outcomes.
Вот как может выглядеть измененный код:
from itertools import repeat
from multiprocessing import Pool, Manager
def reader(entry): # other args are constant
.............................................
#Some condition:
prediction = min(distances) + (mlc_data[min(distances)[1]],)
return entry, prediction
manager = Manager()
outcomes = manager.dict()
with Pool(3) as p:
results = p.map(reader, input[0])
for entry, prediction in results:
outcomes[entry_pairs[' '.join(entry)]] = prediction
Также вам следует обратить внимание на предупреждение DeprecationWarning, которое говорит о том, что использование функций-команд столкнется с проблемами при совместном использовании пула. Вместо этого вы можете использовать стандартный синтаксис управления контекстом (with) для автоматического закрытия и объединения пула.
Используйте outcomes после выполнения Pool, попробуйте так:from itertools import repeat
from multiprocessing import Pool, Manager
def reader(entry, outcomes):
# ...
distances = calculate_distances(entry)
min_distance = min(distances)
prediction = min_distance + (mlc_data[min_distance[1]],)
outcomes[entry_pairs[' '.join(entry)]] = prediction
manager = Manager()
outcomes = manager.dict()
with Pool(3) as p:
# Обрабатываем каждый элемент из input[0] и сохраняем результаты в outcomes:
p.starmap(reader, zip(input[0], repeat(outcomes)))
p.close()
p.join()
print(outcomes) # должен содержать все элементы
from itertools import repeat
from multiprocessing import Pool, Manager
def reader(entry, outcomes):
# ...
distances = calculate_distances(entry)
min_distance = min(distances)
prediction = min_distance + (mlc_data[min_distance[1]],)
outcomes[entry_pairs[' '.join(entry)]] = prediction
manager = Manager()
outcomes = manager.dict()
with Pool(3) as p:
# Обрабатываем каждый элемент из input[0] и сохраняем результаты в outcomes:
p.starmap(reader, zip(input[0], repeat(outcomes)))
p.close()
p.join()
print(outcomes) # должен содержать все элементы
Используйте переменную outcomes после завершения работы пула процессов. Вот так:
```python
from itertools import repeat
from multiprocessing import Pool, Manager
def reader(entry, outcomes):
# ...
prediction = min(distances) + (mlc_data[min(distances)[1]],)
outcomes[entry_pairs[' '.join(entry)]] = prediction
manager = Manager()
outcomes = manager.dict()
with Pool(3) as p:
# Обрабатываем каждый элемент из input[0] и сохраняем результаты в outcomes:
p.starmap(reader, zip(input[0], repeat(outcomes)))
p.close()
p.join()
print(outcomes) # должен содержать все элементы
```