🎨Migración a HTTPX + AsyncIO
🚀 1. El Gran Cambio
De → A
🟦 Requests (síncrono)
➡️
🟩 HTTPX + AsyncIO (asíncrono y concurrente)
¿Por qué importa?
✨ Hasta 50% menos tiempo de respuesta
✨ Concurrencia real
✨ Sin romper nada: conviven métodos síncronos y asíncronos
⚡ 2. Qué cambia técnicamente
🕗 Antes
🔸 Ejecución bloqueante
🔸 Cada request espera a la anterior
🔸 Menor aprovechamiento del I/O
⚡ Ahora
🔹 Varias solicitudes al mismo tiempo
🔹 Métodos asíncronos con prefijo A
🔹 Migración progresiva, sin apagar lo existente
Idea visual
🎯 Menos espera + Más paralelismo + Misma compatibilidad
📦 3. Instalación rápida de HTTPX
🛠️ Instalar:
pip install httpx
ó
uv add httpx
🔍 Verificar:
Revisar dependencias en pyproject.toml.
📌 Motivo: HTTPX funciona de forma nativa con AsyncIO.
🧱 4. Creación del nuevo protocolo asíncrono
Para cada método existente:
1️⃣ Copia el método síncrono
2️⃣ Renómbralo con prefijo A
3️⃣ Usa async def
4️⃣ Mantén la misma estructura y tipos
5️⃣ Retorna el mismo formato de artículos
🎨 Espejo perfecto: misma firma → versión async.
📰 5. Implementación por fuente
🟦 Guardian
Acciones:
- Mover logger arriba
- Importar HTTPX
- Crear método afetch_articles
- Usar async with httpx.AsyncClient()
Fragmento visual:
async def afetch_articles(params):
async with httpx.AsyncClient() as client:
response = await client.get("https://api.guardian...", params=params)
return [...]
🟧 News API
🔁 Igual que Guardian
🎯 Ajustar mapeo de campos (nombres distintos)
🧠 6. Ajuste del Servicio + CLI
🟩 Servicio (core/services)
🧩 Se añaden pares de métodos:
search_articles → search síncrono
a_search_articles → search asíncrono
📌 Lógica:
- Obtener la fuente con el método actual
- Llamar a afetch_articles con await si es async
🖥️ CLI
Crear dos entradas:
🔹 async_main
Usa await.
🔹 main
Ejecuta la corrutina para mantener compatibilidad.
def main():
import asyncio
asyncio.run(async_main())
⭐ Regla clave:
await solo dentro de funciones async.
🔙 7. Superpoder de compatibilidad
✔ Métodos síncronos siguen intactos
✔ Migración por módulos
✔ Tests siguen válidos
✔ Quien quiera usar síncrono, lo usa
✔ Producción puede usar async sin riesgos