Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Sincronización y Comunicación | Multithreading vs. Multiprocessing
Programación Estructural en Python

Sincronización y Comunicación

Desliza para mostrar el menú

Al trabajar con hilos o procesos, a menudo es necesario compartir datos o coordinar sus acciones. Sin una sincronización adecuada, dos hilos podrían intentar actualizar la misma variable al mismo tiempo, lo que conduce a resultados impredecibles conocidos como condiciones de carrera. Para evitar esto, Python proporciona primitivas de sincronización como locks (bloqueos), queues (colas) y shared memory (memoria compartida).

Un lock es un mecanismo sencillo que asegura que solo un hilo pueda acceder a un fragmento de código o dato a la vez. Si un hilo adquiere un lock, los demás hilos que intenten adquirirlo tendrán que esperar hasta que sea liberado. Esto previene que varios hilos realicen cambios conflictivos.

Las queues son otra herramienta poderosa para la comunicación segura entre hilos y procesos. Una cola permite que un hilo o proceso coloque datos de forma segura, mientras otro los extrae. La clase queue.Queue (para hilos) y multiprocessing.Queue (para procesos) gestionan internamente todo el bloqueo necesario, por lo que no tienes que preocuparte por las condiciones de carrera.

Con la shared memory, los procesos pueden acceder directamente a los mismos datos, pero es necesario utilizar primitivas de sincronización como locks o semáforos para evitar conflictos. En la mayoría de los casos, usar queues es más sencillo y seguro para la comunicación entre procesos.

El video anterior muestra cómo un lock puede evitar que dos hilos corrompan datos compartidos, y cómo una queue puede usarse para transferir datos de manera segura entre tareas concurrentes.

1234567891011121314151617181920212223
import threading counter = 0 lock = threading.Lock() def increment(): global counter for _ in range(10000): with lock: # Ensuring only one thread enters this block at a time counter += 1 threads = [] for _ in range(5): t = threading.Thread(target=increment) threads.append(t) t.start() for t in threads: t.join() print("Final counter value:", counter) # Without the lock, the final value would likely be wrong due to race conditions. # With the lock, the result is always correct: 50000.
question mark

¿Qué primitiva de sincronización usarías para compartir datos de forma segura entre varios hilos en Python?

Selecciona la respuesta correcta

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 6

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Sección 3. Capítulo 6
some-alt