Limitar la concurrencia en Python
Un semáforo acota cuántas corrutinas están en la parte costosa a la vez.
import asyncio
async def obtener(nombre, semaforo, activos):
async with semaforo:
activos.append(nombre)
pico = len(activos)
await asyncio.sleep(0.01)
activos.remove(nombre)
return nombre, pico
async def principal():
semaforo = asyncio.Semaphore(2)
activos = []
tareas = [obtener(f"trabajo{i}", semaforo, activos) for i in range(6)]
mayor = 0
for coro in asyncio.as_completed(tareas):
nombre, pico = await coro
mayor = max(mayor, pico)
print("nunca más de", mayor, "a la vez")
asyncio.run(principal())
Cómo funciona
async with semaforoadquiere y libera alrededor del trabajo.- El límite es lo que mantiene educado a un crawler.
as_completedentrega los resultados en orden de término.
Palabras clave y builtins usados aquí
asyncawaitdefforlenmaxprintrangereturnwith
El intento, en números
- Líneas
- 25
- Caracteres a escribir
- 508
- Tokens
- 136
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 74 segundos.
Paso 3 de 4 en Async a fondo; paso 50 de 53 en Python pythónico.