Я использую python3.6 и пытаюсь выполнить что-то похожее на следующий код. Однако после выполнения переменная mydict остается {}
Я пробовал это с global mydict и без. Я думал, что дикты по умолчанию глобальны, но, похоже, они не работают.
mydict = {}
def TEST(hello, integer):
global mydict
mydict[integer] = hello
print(integer)
with closing(Pool(processes=4)) as pool:
pool.starmap(TEST, [['Hello World', i] for i in range(200)])
Возможно ли, чтобы несколько процессов записывали в один и тот же словарь в python?






Is is possible to have multiple processes write to the same dictionary in python?
Нет, невозможно совместно использовать словари между процессами, потому что каждый из них работает в отдельном пространстве памяти, а код Python интерпретируется разными копиями интерпретатора, хотя это можно сделать через общую память для некоторых других типов данных.
Однако его можно смоделировать, используя multiprocessing.Manager() для координации обновлений определенных типов общих объектов, и одним из поддерживаемых типов является dict.
Это обсуждается в разделе Разделение состояния между процессами онлайн-документации. Использование Manager влечет за собой много накладных расходов, потому что они запускаются как отдельный серверный процесс параллельно с любыми другими процессами, создаваемыми вашим кодом.
Во всяком случае, вот рабочий пример, основанный на коде в вашем вопросе, который использует его для управления одновременными обновлениями общего словаря. Поскольку то, что делает функция TEST(), настолько тривиально, вполне возможно, что выполнение этого таким образом медленнее, чем нет с использованием multiprocessing, из-за всех дополнительных накладных расходов, которые это влечет за собой, однако что-то подобное, вероятно, подходит для гораздо более вычислительных задач. -интенсивные задания.
from contextlib import closing
from multiprocessing import Pool, Manager
def TEST(mydict, hello, integer):
mydict[integer] = hello
print(integer)
if __name__ == '__main__':
with Manager() as manager:
my_dict = manager.dict()
with closing(Pool(processes=4)) as pool:
pool.starmap(TEST, ((my_dict, 'Hello World', i) for i in range(200)))
MultiProcessingсоленья для разделения процессов. Когда это происходит, я не уверен, что это маринует глобальные переменные. Возможно, можно просто вернуть значенияinteger, helloи передать их другой звездной карте для обработки. обновление см.: stackoverflow.com/a/11056415/2026508