typestar

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

  1. async with semaforo adquiere y libera alrededor del trabajo.
  2. El límite es lo que mantiene educado a un crawler.
  3. as_completed entrega los resultados en orden de término.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 3 de 4 en Async a fondo; paso 50 de 53 en Python pythónico.

← Anterior Siguiente →