Возможно ли, чтобы несколько процессов записывали в один и тот же словарь, используя Pool.map()?

Я использую 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?

MultiProcessing соленья для разделения процессов. Когда это происходит, я не уверен, что это маринует глобальные переменные. Возможно, можно просто вернуть значения integer, hello и передать их другой звездной карте для обработки. обновление см.: stackoverflow.com/a/11056415/2026508
jmunsch 06.03.2019 00:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
155
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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)))

Другие вопросы по теме