23 · Concorrência
Produza uma sequência assíncrona
Uma async fn* produz valores com yield e pode aguardar entre eles. Ela retorna AsyncIter<T>, consumido com for await. Cada pedido avança o produtor; fechar a sequência ou sair do loop cancela o produtor e executa sua limpeza.
Nesta página
Uma async fn* produz valores com yield e pode aguardar entre eles. Ela retorna AsyncIter<T>, consumido com for await. Cada pedido avança o produtor; fechar a sequência ou sair do loop cancela o produtor e executa sua limpeza.
Exemplo completo
Execute este exemplo localmente com a CLI instalada e o scheduler do host.
Produza uma sequência assí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}")
Requer a CLI/host do Zolo — abra no playground ou rode localmente.
Referência
zolo run examples/features/75-syntax-four-async/02-async-generators.zolo --no-cache
Veja também