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ă obiectul Loop. 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 apel asyncio.run(), fără demontarea buclei.

  • run_forever() – rulează bucla până când stop() este apelată din interiorul unei sarcini. Niciun obiect awaitable de nivel superior; se așteaptă ca aplicația să programeze ceea ce are nevoie prin asyncio.create_task() înainte de a apela run_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 ca asyncio.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 apelabil handler(loop, context) unde context este un dicționar cu cel puțin 'message' și, de obicei, 'exception' și 'future'.

  • get_exception_handler() – returnează gestionarul instalat în prezent sau None dacă 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.