Cuando tu tarea es pesada (codificar imágenes, comprimir, cifrar grandes volúmenes) y es CPU-bound, multiprocessing suele rendir mejor que threads.
1) Patrón básico con Queue
from multiprocessing import Process, Queue, cpu_count
from pathlib import Path
def worker(in_q, out_q):
while True:
item = in_q.get()
if item is None:
break
path = Path(item)
data = path.read_bytes()
# demo: invertir bytes
out_q.put((path.name, data[::-1]))
in_q = Queue()
out_q = Queue()
workers = [Process(target=worker, args=(in_q, out_q)) for _ in range(cpu_count())]
for w in workers: w.start()
files = ["a.jpg", "b.jpg"]
for f in files: in_q.put(f)
for _ in workers: in_q.put(None)
for _ in files:
name, data = out_q.get()
Path("OUT_" + name).write_bytes(data)
for w in workers: w.join()
2) Qué vigilar
- IO vs CPU: si es IO-bound (mucho disco/red), a veces threads es suficiente.
- Serialización: enviar objetos grandes por Queue tiene coste; pasa rutas o chunks.
- Cierre: usa “poison pills” (
None) yjoin().
