8.13. Controlul buclei¶
Majoritatea scripturilor asyncio nu ating niciodată direct bucla de evenimente – asyncio.run() este suficient. Această pagină acoperă suprafața Loop pentru cazurile în care nu este: instalarea unui gestionar de excepții, rularea buclei cu un ciclu de viață diferit de run sau păstrarea obiectului buclă pentru instrumentare.
8.13.1. Obținerea buclei¶
asyncio.get_event_loop()– returnează obiectulLoop. Poate fi apelat în siguranță din interiorul sau din exteriorul unei corutine.asyncio.new_event_loop()– pe MicroPython, resetează starea buclei existente în loc să creeze una nouă. Nota merită repetată: există exact o singură buclă de evenimente per program.
Nu există niciun API pentru rularea buclei în afara metodelor de pe Loop și a asyncio.run().
8.13.2. Rularea buclei direct¶
asyncio.run() este punctul de intrare corect pentru aproape orice aplicație. Două metode Loop există pentru cazurile în care nu este.
run_until_complete()– dat fiind un obiect awaitable, rulează bucla până când acel obiect awaitable se termină, apoi returnează rezultatul său. Echivalent cu un singur apelasyncio.run(), fără demontarea buclei.run_forever()– rulează bucla până cândstop()este apelată din interiorul unei sarcini. Niciun obiect awaitable de nivel superior; se așteaptă ca aplicația să programeze ceea ce are nevoie prinasyncio.create_task()înainte de a apelarun_forever.
Metodele însoțitoare sunt stop() (cere buclei să se oprească după ce sarcina curentă se termină) și close() (eliberează resursele buclei).
8.13.3. Crearea de sarcini din partea buclei¶
create_task()– aceeași operație caasyncio.create_task(). Funcția liberă există pentru ca codul aplicației să nu aibă nevoie de o referință la buclă pentru cazul obișnuit; metoda există pentru instrumentarea care are deja una.
8.13.4. Gestionari de excepții¶
Bucla apelează un gestionar atunci când o sarcină ridică o excepție pe care nimic din lanțul de apeluri al corutinei nu a prins-o – un caz tipic fiind o sarcină pe care aplicația a creat-o cu asyncio.create_task() și pe care nu a așteptat-o niciodată. Gestionarul implicit afișează un traceback prin sys.stderr; pagina excepții a arătat cum poate fi înlocuit cu ceva personalizat.
set_exception_handler()– instalează un gestionar personalizat. Gestionarul este un apelabilhandler(loop, context)undecontexteste un dicționar cu cel puțin'message'și, de obicei,'exception'și'future'.get_exception_handler()– returnează gestionarul instalat în prezent sauNonedacă este folosit cel implicit.default_exception_handler()– gestionarul încorporat. Util în interiorul unui gestionar personalizat care dorește să ruleze de asemenea comportamentul implicit (de exemplu, să jurnalizeze în memoria flash și să afișeze un traceback).call_exception_handler()– rulează gestionarul instalat în prezent cu un dicționar de context construit manual. Folosit mai ales de bucla însăși; o aplicație are rareori nevoie de el.