CodeGym /Corsi /Python SELF IT /Classe Future

Classe Future

Python SELF IT
Livello 26 , Lezione 1
Disponibile

8.1 Caratteristiche principali della classe Future

Classe Future nel modulo asyncio rappresenta il risultato di un'operazione asincrona che sarà disponibile in futuro. Gli oggetti Future sono utilizzati per gestire lo stato e i risultati delle attività asincrone.

Caratteristiche principali della classe Future

L'oggetto Future è un contenitore per il risultato, che sarà disponibile più tardi, al termine dell'esecuzione dell'attività. Fornisce un'interfaccia per ottenere il risultato o l'eccezione, che saranno impostati al termine dell'operazione asincrona.

Creazione e gestione degli oggetti Future

  • Creazione: Di solito viene creato utilizzando loop.create_future().
  • Impostazione del risultato: Il risultato viene impostato tramite il metodo set_result(result).
  • Impostazione dell'eccezione: L'eccezione viene impostata tramite il metodo set_exception(exception).

Metodi e attributi principali

set_result(result):

Imposta il risultato per l'oggetto Future. Tutte le coroutine che aspettano questo oggetto, verranno immediatamente riprese con questo risultato.

set_exception(exception):

Imposta l'eccezione per l'oggetto Future. Tutte le coroutine che aspettano questo oggetto, verranno immediatamente riprese con questa eccezione.

result():

Restituisce il risultato dell'oggetto Future, se disponibile. Se l'operazione è terminata con un'eccezione, solleverà questa eccezione.

exception():

Restituisce l'eccezione, se è stata impostata, o None, se l'oggetto Future non è ancora terminato o è terminato con successo.

done():

Restituisce True, se l'oggetto Future è terminato (con risultato o eccezione).

add_done_callback(callback):

Aggiunge un callback che verrà chiamato al termine dell'oggetto Future.

8.2 Esempi di utilizzo

Impostazione e ottenimento del risultato


import asyncio

async def set_future_result(fut, delay):
    await asyncio.sleep(delay)
    fut.set_result("Future result is ready")
            
async def main():
    loop = asyncio.get_running_loop()
    fut = loop.create_future()
    asyncio.create_task(set_future_result(fut, 2))
    result = await fut
    print(result)
            
asyncio.run(main())

Gestione delle eccezioni


import asyncio

async def set_future_exception(fut, delay):
    await asyncio.sleep(delay)
    fut.set_exception(ValueError("An error occurred"))
            
async def main():
    loop = asyncio.get_running_loop()
    fut = loop.create_future()
    asyncio.create_task(set_future_exception(fut, 2))
    try:
        result = await fut
    except ValueError as e:
        print(f"Caught an exception: {e}")

asyncio.run(main())

Interazione con i task

Spesso gli oggetti Future vengono utilizzati in combinazione con i task (Tasks). Quando un task viene creato tramite asyncio.create_task(), viene automaticamente creato un oggetto Future, che può essere utilizzato per monitorare e gestire lo stato del task.


import asyncio

async def example_coroutine():
    await asyncio.sleep(1)
    return "Task result"
            
async def main():
    task = asyncio.create_task(example_coroutine())
    print(await task)
            
asyncio.run(main())

8.3 Vantaggi e caratteristiche

Gli oggetti Future consentono di gestire i risultati e le eccezioni delle operazioni asincrone, garantendo flessibilità e controllo sull'esecuzione. Future può essere utilizzato in diversi scenari di programmazione asincrona, comprese attività, timer, callback e molto altro.

Spesso gli oggetti Future vengono utilizzati in combinazione con i task (Tasks). Questo approccio consente di ottenere un livello più elevato di controllo sull'esecuzione e lo stato delle operazioni asincrone.

Limitazioni

In alcuni casi, l'uso di Future può essere più complesso rispetto all'uso di astrazioni di livello superiore, come i task (Tasks) o le coroutine. Utilizzando Future potrebbe essere necessario un maggiore controllo manuale dello stato e dei risultati delle operazioni asincrone.

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