10.1 AsyncIterator
Los iteradores asíncronos (AsyncIterator) permiten trabajar con secuencias de datos que producen elementos de forma asíncrona. Se utilizan en funciones asíncronas y corrutinas para iterar sobre datos que pueden ser obtenidos con retraso, por ejemplo, de solicitudes de red, operaciones de I/O asíncronas u otras fuentes asíncronas.
Iterador asíncrono
Un iterador asíncrono debe implementar dos métodos:
Método __aiter__():
Este método debe devolver el propio iterador asíncrono. Es similar al método __iter__() para iteradores síncronos.
Método __anext__():
Este método debe devolver el siguiente valor de forma asíncrona o lanzar una excepción StopAsyncIteration si los elementos se han agotado. Es similar al método __next__() para iteradores síncronos.
Ejemplo:
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) # Simulación de retraso asíncrono
self.current += 1
return self.current
async def main():
async for number in AsyncIterator(1, 5):
print(number)
asyncio.run(main())
Los iteradores asíncronos permiten procesar datos a medida que se reciben, sin bloquear la ejecución de otras tareas. Esto es especialmente útil para trabajar con solicitudes de red y otras operaciones asíncronas.
El uso de iteradores asíncronos permite escribir código más legible y mantenible para procesar secuencias de datos de manera asíncrona.
10.2 AsyncGenerator
Los generadores asíncronos permiten producir valores de forma asíncrona, utilizando las palabras clave async y await. Funcionan de manera similar a los generadores normales, pero pueden pausar la ejecución para llevar a cabo operaciones asíncronas.
Creación de un generador asíncrono
Un generador asíncrono se define utilizando async def y yield. Los generadores asíncronos pueden usar await dentro de sí mismos para realizar operaciones asíncronas.
Ejemplo:
async def async_generator():
for i in range(3):
await asyncio.sleep(1) # Retraso asíncrono
yield i # Generación de valor
Uso de un generador asíncrono
Los generadores asíncronos se utilizan dentro de funciones asíncronas con la instrucción async for.
import asyncio
async def main():
async for value in async_generator():
print(value)
asyncio.run(main())
Los generadores asíncronos mejoran la legibilidad y mantenibilidad del código, permitiendo usar una construcción sintáctica simple async for para trabajar con secuencias asíncronas.
GO TO FULL VERSION