Introducción
Cuando se trabaja con el módulo multiprocesamiento de Python, coordinar la comunicación entre procesos es fundamental para crear aplicaciones paralelas eficientes. En este tutorial, exploraremos la comunicación entre procesos (IPC) mediante colas y tuberías, y abordaremos los objetos de memoria compartida como enfoque complementario. Aprenderá a utilizar estas herramientas para intercambiar datos entre procesos de forma eficaz y evitar errores comunes.
Colas de multiprocesamiento
Las colas son una forma segura para los subprocesos y los procesos de intercambiar datos entre procesos. Te permiten poner datos en cola en un proceso y sacarlos de la cola en otro.
Ejemplo: uso de una cola
import multiprocessing
def worker(q):
# Poner un mensaje en la cola
"Hello from worker!")
q.put(
if __name__ == "__main__":
= multiprocessing.Queue()
q = multiprocessing.Process(target=worker, args=(q,))
p
p.start()# Recupera el mensaje de la cola
= q.get()
message print("Message from worker:", message)
p.join()
Las colas gestionan la sincronización internamente, lo que las convierte en una opción conveniente para la comunicación entre procesos sin necesidad de mecanismos de bloqueo adicionales.
Tuberías de multiprocesamiento
Las tuberías proporcionan un canal de comunicación bidireccional entre dos procesos. Son más sencillas que las colas, pero se suelen utilizar para la comunicación punto a punto.
Ejemplo: uso de una tubería
import multiprocessing
def worker(conn):
# Enviar un mensaje a través de la tubería
"Hello from worker!")
conn.send(
conn.close()
if __name__ == "__main__":
= multiprocessing.Pipe()
parent_conn, child_conn = multiprocessing.Process(target=worker, args=(child_conn,))
p
p.start()# Recibe el mensaje de la tubería
= parent_conn.recv()
message print("Message from worker:", message)
p.join()
Las tuberías son ideales para la comunicación simple y directa entre dos procesos, pero para escenarios más complejos con múltiples productores y consumidores, a menudo son preferibles las colas.
Objetos de memoria compartida
Además de las colas y los pipes, Python proporciona objetos de memoria compartida (como multiprocessing.Value
y multiprocessing.Array
) para compartir datos entre procesos sin necesidad de serialización. Esto puede reducir la sobrecarga de comunicación.
Ejemplo: uso de un valor compartido
import multiprocessing
def increment(shared_val):
# Usa un bloqueo para evitar condiciones de carrera
with shared_val.get_lock():
+= 1
shared_val.value
if __name__ == "__main__":
= multiprocessing.Value('i', 0)
shared_val = []
processes for _ in range(5):
= multiprocessing.Process(target=increment, args=(shared_val,))
p
processes.append(p)
p.start()for p in processes:
p.join()print("Final value:", shared_val.value)
Cuando utilice objetos de memoria compartida, utilice siempre bloqueos u otros mecanismos de sincronización para evitar condiciones de carrera.
Conclusión
La comunicación entre procesos es un aspecto clave para crear aplicaciones multiprocesamiento robustas. Las colas y los pipes proporcionan formas sencillas de intercambiar datos entre procesos, mientras que los objetos de memoria compartida ofrecen una solución eficiente para compartir grandes estructuras de datos sin una sobrecarga excesiva. Al comprender y aplicar estas herramientas, puede diseñar aplicaciones Python que sean eficientes y escalables.
Lecturas adicionales
- Multiprocesamiento frente a multihilos en Python
- Optimización del código de multiprocesamiento en Python
- Solución de problemas de multiprocesamiento
- Aplicaciones multiprocesamiento reales en Python
Feliz programación, y que tus procesos se comuniquen de manera eficiente!
Explorar más artículos
Aquí hay más artículos de la misma categoría para ayudarte a profundizar en el tema.
Reutilización
Cómo citar
@online{kassambara2024,
author = {Kassambara, Alboukadel},
title = {Uso de colas y tuberías de multiprocesamiento},
date = {2024-02-05},
url = {https://www.datanovia.com/es/learn/programming/python/advanced/parallel-processing/multiprocessing-queues-and-pipes.qmd},
langid = {es}
}