Ejecuta cualquier ejemplo en nuestra consola interactiva: Abrir consola de Python →
Paralelismo con multiprocessing en Python
El módulo multiprocessing permite ejecutar código en múltiples procesos reales, evitando el GIL y aprovechando todos los núcleos de la CPU. En esta guía aprenderás a crear procesos, usar colas, pools, comunicación entre procesos y patrones profesionales para tareas intensivas en CPU.
Tabla de contenidos
- Procesos básicos
- Procesos con funciones
- Colas entre procesos
- Pipes
- Pool de procesos
- Map, starmap y apply_async
- Compartir memoria
- Ejercicios
- Mini‑proyecto
1. Procesos básicos
from multiprocessing import Process
def tarea():
print("Proceso ejecutado")
p = Process(target=tarea)
p.start()
p.join()
2. Procesos con funciones
from multiprocessing import Process
import time
def contar(n):
for i in range(n):
print(i)
time.sleep(0.5)
p = Process(target=contar, args=(5,))
p.start()
p.join()
3. Colas entre procesos
from multiprocessing import Process, Queue
import time
def productor(q):
for i in range(5):
q.put(i)
time.sleep(1)
def consumidor(q):
while True:
item = q.get()
print("Consumido:", item)
q = Queue()
Process(target=productor, args=(q,)).start()
Process(target=consumidor, args=(q,)).start()
4. Pipes
from multiprocessing import Process, Pipe
def hijo(conn):
conn.send("Hola padre")
conn.close()
padre, hijo_conn = Pipe()
p = Process(target=hijo, args=(hijo_conn,))
p.start()
print(padre.recv())
p.join()
5. Pool de procesos
from multiprocessing import Pool
import time
def cuadrado(n):
time.sleep(1)
return n * n
with Pool(4) as pool:
resultados = pool.map(cuadrado, [1,2,3,4])
print(resultados)
6. Map, starmap y apply_async
from multiprocessing import Pool
def sumar(a, b):
return a + b
with Pool() as pool:
print(pool.starmap(sumar, [(1,2), (3,4)]))
r = pool.apply_async(sumar, (10, 20))
print(r.get())
7. Compartir memoria
from multiprocessing import Process, Value
def incrementar(v):
for _ in range(1000):
v.value += 1
v = Value('i', 0)
p1 = Process(target=incrementar, args=(v,))
p2 = Process(target=incrementar, args=(v,))
p1.start(); p2.start()
p1.join(); p2.join()
print(v.value)
8. Ejercicios
- Crea un productor‑consumidor con multiprocessing.
- Usa Pipe para enviar múltiples mensajes.
- Implementa un pool que procese 100 números.
- Usa apply_async para tareas dinámicas.
- Comparte memoria entre 4 procesos.
# pool grande
pool.map(func, range(100))
# pipe múltiple
conn.send("msg1"); conn.send("msg2")
9. Mini‑proyecto: Procesador paralelo de imágenes
from multiprocessing import Pool
import time
def procesar(img):
print("Procesando", img)
time.sleep(1)
return img + "_ok"
imagenes = ["img1", "img2", "img3", "img4"]
with Pool(4) as pool:
resultados = pool.map(procesar, imagenes)
print(resultados)