8.13. Controllo del loop#
La maggior parte degli script asyncio non tocca mai direttamente l’event loop – asyncio.run() è sufficiente. Questa pagina copre l’interfaccia Loop per i casi in cui non lo è: l’installazione di un gestore di eccezioni, l’esecuzione del loop con un ciclo di vita diverso da run, o il mantenimento dell’oggetto loop per scopi di strumentazione.
8.13.1. Ottenere il loop#
asyncio.get_event_loop()– restituisce l’oggettoLoop. Può essere chiamato in sicurezza da dentro o fuori una coroutine.asyncio.new_event_loop()– su MicroPython, reimposta lo stato del loop esistente invece di crearne uno nuovo. Vale la pena ripetere la nota: c’è esattamente un event loop per programma.
Non esiste alcuna API per eseguire il loop diversa dai metodi di Loop e da asyncio.run().
8.13.2. Eseguire il loop direttamente#
asyncio.run() è il punto di ingresso giusto per quasi ogni applicazione. Esistono due metodi di Loop per i casi in cui non lo è.
run_until_complete()– dato un oggetto awaitable, esegue il loop finché quell’awaitable non termina, quindi restituisce il suo risultato. Equivalente a una singola chiamata aasyncio.run(), ma senza lo smantellamento del loop.run_forever()– esegue il loop finchéstop()non viene chiamato dall’interno di un task. Nessun awaitable di primo livello; ci si aspetta che l’appluicazione pianifichi tutto ciò che le serve tramiteasyncio.create_task()prima di chiamarerun_forever.
I metodi associati sono stop() (richiede l’arresto del loop dopo il termine del task corrente) e close() (libera le risorse del loop).
8.13.3. Creazione di task lato loop#
create_task()– stessa operazione diasyncio.create_task(). La funzione libera esiste perché il codice applicativo non abbia bisogno di un riferimento al loop nel caso comune; il metodo esiste per la strumentazione che ne possiede già uno.
8.13.4. Gestori di eccezioni#
Il loop chiama un gestore quando un task solleva un’eccezione che nulla nella catena di chiamate delle coroutine ha catturato – un caso tipico è un task creato dall’applicazione con asyncio.create_task() e mai atteso. Il gestore predefinito stampa un traceback attraverso sys.stderr; la pagina sulle eccezioni ha mostrato come sostituirlo con qualcosa di personalizzato.
set_exception_handler()– installa un gestore personalizzato. Il gestore è un callablehandler(loop, context)dovecontextè un dizionario che contiene almeno'message'e di solito'exception'e'future'.get_exception_handler()– restituisce il gestore attualmente installato, oppureNonese è in uso quello predefinito.default_exception_handler()– il gestore integrato. Utile all’interno di un gestore personalizzato che vuole eseguire anche il comportamento predefinito (registrare su flash e stampare un traceback, per esempio).call_exception_handler()– esegue il gestore attualmente installato con un dizionario di contesto costruito a mano. Usato per lo più dal loop stesso; un’applicazione ne ha raramente bisogno.