Saltar al contenido

23 · Concurrencia

Produce una secuencia asíncrona

Una async fn* produce valores con yield y puede esperar entre ellos. Devuelve AsyncIter<T>, consumido con for await. Cada petición avanza el productor; cerrar la secuencia o salir del bucle cancela el productor y ejecuta su limpieza.

En esta página

Una async fn* produce valores con yield y puede esperar entre ellos. Devuelve AsyncIter<T>, consumido con for await. Cada petición avanza el productor; cerrar la secuencia o salir del bucle cancela el productor y ejecuta su limpieza.

Ejemplo completo

Ejecuta este ejemplo localmente con la CLI instalada y el scheduler del host.

Produce una secuencia asíncrona.

02-async-generators.zolo
Playground
// Fetching pages is driven by the consumer. Breaking closes the producer.

let mut fetched = 0
let mut closed = 0

async fn fetch_page(id: int) -> int {
    sleep 1ms
    fetched += 1
    id * 10
}

async fn* pages(ids: [int]) -> int {
    defer { closed += 1 }
    for id in ids {
        yield await fetch_page(id)
    }
}

let source: AsyncIter<int> = pages([1, 2, 3])
assert(fetched == 0)
let mut total = 0
let mut count = 0
for await page in source {
    total += page
    count += 1
    if count == 2 { break }
}
assert(total == 30)
assert(fetched == 2)
assert(closed == 1)
print("pages: {count}, total: {total}, closed: {closed}")

Requiere la CLI o el host de Zolo; ábrelo en el playground o ejecútalo localmente.

Referencia

Referencia · Programa fuente

zolo run examples/features/75-syntax-four-async/02-async-generators.zolo --no-cache

Consulta también

Índice global

Encuentra tu camino por Zolo

Prueba una idea

Empieza aquí

9 resultados

9 resultados

enespt-br