«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как избежать состояний гонки при совместном использовании словарей в многопроцессорной обработке?

Как избежать состояний гонки при совместном использовании словарей в многопроцессорной обработке?

Опубликовано 21 декабря 2024 г.
Просматривать:568

How to Avoid Race Conditions When Sharing Dictionaries in Multiprocessing?

Как синхронизировать доступ к общим словарям в многопроцессорной обработке

В многопроцессорной среде нескольким процессам может потребоваться доступ к общим данным, таким как словарь. Однако если не реализованы надлежащие механизмы синхронизации, могут возникнуть условия гонки, приводящие к ненадежным или поврежденным данным.

Рассмотрим сценарий, в котором несколько дочерних процессов обращаются к глобальному словарю 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