CodeGym /Corsi /Python SELF IT /Iteratori e generatori asincroni

Iteratori e generatori asincroni

Python SELF IT
Livello 26 , Lezione 3
Disponibile

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.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION