10.1 AsyncIterator
Iteradores assíncronos (AsyncIterator) permitem trabalhar com sequências de dados que produzem elementos de forma assíncrona. Eles são usados em funções assíncronas e corrotinas para iterar sobre dados que podem ser obtidos com atraso, como por exemplo, de requisições de rede, operações assíncronas de I/O ou outras fontes assíncronas.
Iterador assíncrono
Um iterador assíncrono deve implementar dois métodos:
Método __aiter__():
Este método deve retornar o próprio iterador assíncrono. Ele é análogo ao método __iter__() para iteradores síncronos.
Método __anext__():
Este método deve retornar o próximo valor de forma assíncrona ou lançar uma exceção StopAsyncIteration se os elementos acabarem. Ele é análogo ao método __next__() para iteradores síncronos.
Exemplo:
import asyncio
class AsyncIterator:
def __init__(self, start, end):
self.current = start
self.end = end
def __aiter__(self):
return self
async def __anext__(self)(self):
if self.current >= self.end:
raise StopAsyncIteration
await asyncio.sleep(1) # Imitação de atraso assíncrono
self.current += 1
return self.current
async def main():
async for number in AsyncIterator(1, 5):
print(number)
asyncio.run(main())
Iteradores assíncronos permitem processar dados conforme eles chegam, sem bloquear a execução de outras tarefas. Isso é especialmente útil para trabalhar com requisições de rede e outras operações assíncronas.
O uso de iteradores assíncronos permite escrever um código mais legível e fácil de manter para processar sequências de dados de forma assíncrona.
10.2 AsyncGenerator
Geradores assíncronos permitem produzir valores de forma assíncrona, usando as palavras-chave async e await. Eles funcionam de forma semelhante aos geradores comuns, mas podem pausar a execução para realizar operações assíncronas.
Criando um gerador assíncrono
Um gerador assíncrono é definido utilizando async def e yield. Geradores assíncronos podem usar await dentro deles para realizar operações assíncronas.
Exemplo:
async def async_generator():
for i in range(3):
await asyncio.sleep(1) # Atraso assíncrono
yield i # Geração de valor
Usando um gerador assíncrono
Geradores assíncronos são utilizados dentro de funções assíncronas com o operador async for.
import asyncio
async def main():
async for value in async_generator():
print(value)
asyncio.run(main())
Geradores assíncronos melhoram a legibilidade e a manutenibilidade do código, permitindo usar uma construção sintática simples async for para trabalhar com sequências assíncronas.
GO TO FULL VERSION