10.1 AsyncIterator
Gli iteratori asincroni (AsyncIterator)
ti permettono di lavorare con
sequenze di dati che producono elementi in modo asincrono.
Si usano nelle funzioni asincrone e nelle coroutine per iterare su
dati che potrebbero essere ottenuti con un ritardo, ad esempio, da
richieste di rete, operazioni di I/O asincrone o altre
fonti asincrone.
Iteratore asincrono
Un iteratore asincrono deve implementare due metodi:
Metodo __aiter__()
:
Questo metodo deve restituire lo stesso iteratore asincrono. È simile
al metodo __iter__()
per gli iteratori sincroni.
Metodo __anext__()
:
Questo metodo deve restituire il valore successivo in modo asincrono o
lanciare un'eccezione StopAsyncIteration
se non ci sono più elementi.
È simile al metodo __next__()
per gli iteratori sincroni.
Esempio:
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) # Simulazione di un ritardo asincrono
self.current += 1
return self.current
async def main():
async for number in AsyncIterator(1, 5):
print(number)
asyncio.run(main())
Gli iteratori asincroni permettono di gestire i dati man mano che arrivano, senza bloccare l'esecuzione di altri task. Questo è particolarmente utile per lavorare con richieste di rete e altre operazioni asincrone.
L'utilizzo degli iteratori asincroni consente di scrivere codice più leggibile e manutenibile per gestire le sequenze di dati in modo asincrono.
10.2 AsyncGenerator
I generatori asincroni permettono di produrre valori in modo asincrono,
usando le parole chiave async
e await
.
Funzionano in modo simile ai generatori normali, ma possono
sospendere l'esecuzione per eseguire operazioni asincrone.
Creare un generatore asincrono
Un generatore asincrono si definisce usando
async
def
e yield
.
I generatori asincroni possono usare await
all'interno
per eseguire operazioni asincrone.
Esempio:
async def async_generator():
for i in range(3):
await asyncio.sleep(1) # Ritardo asincrono
yield i # Generazione del valore
Utilizzo di un generatore asincrono
I generatori asincroni si usano all'interno di funzioni asincrone con
l'operatore async for
.
import asyncio
async def main():
async for value in async_generator():
print(value)
asyncio.run(main())
I generatori asincroni migliorano la leggibilità e la manutenibilità del codice,
permettendo di usare una semplice costruzione sintattica
async for
per lavorare con sequenze asincrone.
GO TO FULL VERSION