Qué vas a construir
Un pipeline que ingesta varias cámaras MJPEG a la vez sobre un único hilo, envía cada frame a un servicio de detección por HTTP, conecta las etapas con colas acotadas que descartan lo viejo cuando la carga aprieta, y publica los eventos a un dashboard en vivo. Aguanta 64 cámaras, sobrevive a que una fuente se caiga, apaga en orden sin perder lo que está en vuelo, y te dice mirando una cola dónde está el cuello de botella. Más cuatro capítulos bonus: tu webcam, cámaras IP por RTSP, video del navegador por WebRTC, y cómo se ve todo esto cuando pasas a cientos de streams con GStreamer.
Objetivos de aprendizaje
Al terminar este taller vas a poder:
- Explicar por qué un pipeline de video síncrono colapsa al pasar de una a varias fuentes, y medirlo con números
- Entender el modelo mental de asyncio: corrutina,
awaity event loop, y cuándo ayuda de verdad - Reconocer trabajo I/O-bound y trabajo CPU-bound, y ver con tus ojos cómo el segundo congela el event loop
- Sacar el cómputo pesado de tu proceso poniéndolo detrás de un socket, en vez de detrás de un hilo
- Transmitir MJPEG con
aiohttpsin un solo hilo en la ruta de ingesta - Conectar etapas con
asyncio.Queueacotadas y aplicar backpressure - Elegir por etapa entre bloquear al productor y descartar lo viejo, como decisión de política
- Montar el pipeline completo con
asyncio.create_tasky medir la mejora contra tu baseline - Aislar fallos por fuente con timeouts, backoff y cancelación
- Apagar en orden con centinelas, plazos y
return_exceptions=True - Diagnosticar el cuello de botella mirando la longitud de las colas, sin abrir un profiler
- Conectar fuentes reales: webcam, RTSP y WebRTC, y saber cuál de ellas justifica un hilo
Prerrequisitos / Stack
- Python 3.12 o superior (usamos
asyncio.timeoutyasyncio.TaskGroup, que llegaron en 3.11) - asyncio, incluido con Python
- aiohttp 3.10
- FastAPI 0.115 y uvicorn 0.32, para los servicios de cámaras y modelo
- OpenCV (opencv-python 4.10) y NumPy 2.x
- ultralytics 8.3 (YOLO11n, corre en CPU) con un modo
--fakepor si no puedes instalar torch - aiortc 1.9, solo para el bonus de WebRTC
Contenido del taller
-
01
Prerrequisitos
-
02
El mapa del proyecto
-
03
El mundo exterior: cámaras y modelo
-
04
El problema y el panorama
-
05
La referencia: el número a batir
-
06
asyncio 101: corrutinas, await y el event loop
-
07
Tu primer gather, y el error que todos cometemos una vez
-
08
La trampa de la CPU
-
09
El executor, y el precio que trae
-
10
El modelo detrás de un socket
-
11
Ingesta asíncrona: transmitir, no leer
-
12
Colas acotadas y backpressure
-
13
Bloquear o descartar: elegir tu política
-
14
El montaje: el pipeline completo
-
15
Escala: sesenta y cuatro cámaras
-
16
Resiliencia: cuando una cámara se cae
-
17
Apagado limpio
-
18
Observabilidad: qué te dice una cola
-
19
Bonus: tu webcam, la excepción honesta
-
20
Bonus: cámaras IP por RTSP
-
21
Bonus: video del navegador con WebRTC
-
22
Bonus: cientos de streams con GStreamer, y el supervisor
-
23
Lo que lograste, y por dónde seguir