Funcții sys pentru generatoare asincrone și corutine în Python

Interpretorul (sys) Python 3.6+ (coroutine_origin_tracking: 3.7+)

Funcții de nivel jos folosite de bibliotecile asincrone (asyncio) pentru generatoare și corutine.

Sintaxă
sys.set_asyncgen_hooks(firstiter=None, finalizer=None) / sys.get_asyncgen_hooks()
sys.set_coroutine_origin_tracking_depth(n) / sys.get_coroutine_origin_tracking_depth()

Ce face Funcții sys pentru generatoare asincrone și corutine

set_asyncgen_hooks() înregistrează funcții apelate la prima iterare a unui generator asincron (firstiter) și când acesta trebuie închis (finalizer). asyncio le folosește ca să închidă corect generatoarele neterminate. get_asyncgen_hooks() returnează funcțiile curente.

set_coroutine_origin_tracking_depth(n) face ca fiecare corutină să rețină ultimele n cadre ale locului unde a fost creată, informație afișată în avertismentul „coroutine was never awaited”. Modul de depanare al asyncio o activează.

Ce returnează

Obiecte cu funcțiile înregistrate sau un întreg.

Exemple

Exemplul 1: Funcții înregistrate și originea corutinelor

import sys
print(sys.get_asyncgen_hooks())
sys.set_asyncgen_hooks(firstiter=lambda g: print("pornit:", g.__name__))

async def numere():
    yield 1

g = numere()
try:
    g.asend(None).send(None)
except StopIteration as e:
    print("primit:", e.value)
sys.set_asyncgen_hooks(firstiter=None)

sys.set_coroutine_origin_tracking_depth(2)
async def lucru():
    pass
c = lucru()
print(sys.get_coroutine_origin_tracking_depth(), c.cr_origin is not None)
c.close()

Rezultat

asyncgen_hooks(firstiter=None, finalizer=None)
pornit: numere
primit: 1
2 True

Greșeli frecvente

  • Înlocuiești funcțiile setate de asyncio în timp ce rulează o buclă de evenimente; generatoarele asincrone nu mai sunt închise corect.

Comenzi înrudite

  • async / await: Scrie cod asincron: funcții care pot aștepta (rețea, fișiere, temporizări) fără să blocheze restul programului.
  • yield (generatoare): Transformă o funcție într-un generator, care produce valorile una câte una, la cerere.