Как синхронизировать доступ к общим словарям в многопроцессорной обработке
В многопроцессорной среде нескольким процессам может потребоваться доступ к общим данным, таким как словарь. Однако если не реализованы надлежащие механизмы синхронизации, могут возникнуть условия гонки, приводящие к ненадежным или поврежденным данным.
Рассмотрим сценарий, в котором несколько дочерних процессов обращаются к глобальному словарю D во время работы с общей очередью Q. Первоначально, словарь, по-видимому, хранит результаты, измененные дочерними процессами. Однако как только основной процесс присоединяется к Q, словарь D становится пустым.
Эта проблема связана с асинхронной природой многопроцессорной обработки. Каждый дочерний процесс имеет собственное пространство памяти, и изменения, внесенные в общие переменные, могут быть не сразу видны другим процессам без надлежащей синхронизации.
Использование объекта-менеджера для синхронизации
Общим решением для синхронизации доступа к общим данным при многопроцессорной обработке является использование объекта Manager. Диспетчер предоставляет сегменты общей памяти, к которым могут получить доступ все участвующие процессы.
Вот как можно реализовать синхронизацию с помощью диспетчера:
from multiprocessing import Process, Manager def f(d): d[1] = '1' d['2'] = 2 if __name__ == '__main__': manager = Manager() d = manager.dict() d[1] = '1' d['2'] = 2 p1 = Process(target=f, args=(d,)) p2 = Process(target=f, args=(d,)) p1.start() p2.start() p1.join() p2.join() print(d)
В этом примере объект Manager создает общий словарь d, доступный обоим дочерним процессам. Когда дочерний процесс изменяет словарь, изменения немедленно становятся видимыми для других процессов.
Вывод:
$ python mul.py {1: '111', '2': 6}
Эти выходные данные показывают, что общий словарь был успешно синхронизирован и обновлен дочерними процессами.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3