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
// 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
zolo run examples/features/75-syntax-four-async/02-async-generators.zolo --no-cache
Consulta también