"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo evitar condiciones de carrera al compartir diccionarios en multiprocesamiento?

¿Cómo evitar condiciones de carrera al compartir diccionarios en multiprocesamiento?

Publicado el 2024-12-21
Navegar:503

How to Avoid Race Conditions When Sharing Dictionaries in Multiprocessing?

Cómo sincronizar el acceso a diccionarios compartidos en multiprocesamiento

En un entorno de multiprocesamiento, múltiples procesos pueden requerir acceso a datos compartidos, como un diccionario. Sin embargo, si no se implementan los mecanismos de sincronización adecuados, pueden ocurrir condiciones de carrera, lo que lleva a datos no confiables o corruptos.

Considere un escenario donde varios procesos secundarios acceden a un diccionario global D mientras trabajan en una cola compartida Q. Inicialmente, el diccionario parece almacenar los resultados modificados por los procesos secundarios. Sin embargo, una vez que el proceso principal se une a Q, el diccionario D queda vacío.

Este problema surge de la naturaleza asincrónica del multiprocesamiento. Cada proceso hijo tiene su propio espacio de memoria y es posible que las modificaciones realizadas en las variables compartidas no sean visibles inmediatamente para otros procesos sin una sincronización adecuada.

Uso de un objeto administrador para la sincronización

Una solución común para sincronizar el acceso a datos compartidos en multiprocesamiento es utilizar un objeto Manager. Un Manager proporciona segmentos de memoria compartida a los que pueden acceder todos los procesos participantes.

Así es como puede implementar la sincronización usando un 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)

En este ejemplo, el objeto Manager crea un diccionario compartido d, al que pueden acceder ambos procesos secundarios. Cuando un proceso hijo modifica el diccionario, los cambios son inmediatamente visibles para otros procesos.

Salida:

$ python mul.py
{1: '111', '2': 6}

Este resultado demuestra que los procesos secundarios sincronizaron y actualizaron correctamente el diccionario compartido.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3