async / await în Python

Programare asincronă Python 3.5+ (aiter/anext: 3.10+)

Scrie cod asincron: funcții care pot aștepta (rețea, fișiere, temporizări) fără să blocheze restul programului.

Sintaxă
async def functie():
    rezultat = await alta_functie()

asyncio.run(functie())

Ce face async / await

async def definește o corutină. Apelul ei nu rulează codul imediat, ci returnează un obiect care trebuie așteptat cu await sau pornit cu asyncio.run(). În timp ce o corutină așteaptă (de exemplu un răspuns din rețea), alte corutine pot lucra.

asyncio.gather() rulează mai multe corutine în paralel. async for parcurge iteratoare asincrone, iar async with folosește context managere asincrone.

Funcțiile încorporate aiter() și anext() (Python 3.10+) sunt versiunile asincrone ale lui iter() și next(); anext() trebuie așteptat cu await.

Exemple

Exemplul 1: Trei sarcini în paralel

Fiecare sarcină așteaptă 0,1-0,3 secunde, dar toate rulează în același timp, deci totalul este cât cea mai lungă.

import asyncio

async def descarca(nume, secunde):
    await asyncio.sleep(secunde)
    return f"{nume} gata"

async def main():
    rezultate = await asyncio.gather(
        descarca("imagine", 0.3),
        descarca("text", 0.1),
        descarca("video", 0.2),
    )
    print(rezultate)

asyncio.run(main())

Rezultat

['imagine gata', 'text gata', 'video gata']

Exemplul 2: Generator asincron, aiter() și anext()

import asyncio

async def numere(n):
    for i in range(n):
        await asyncio.sleep(0)
        yield i

async def main():
    async for x in numere(3):
        print("async for:", x)
    it = aiter(numere(5))
    print("anext:", await anext(it), await anext(it))
    print(await anext(aiter(numere(0)), "gol"))

asyncio.run(main())

Rezultat

async for: 0
async for: 1
async for: 2
anext: 0 1
gol

Greșeli frecvente

  • Apelezi o corutină fără await: descarca("x", 1). Codul nu rulează, iar Python afișează RuntimeWarning: coroutine ... was never awaited.
  • Folosești time.sleep() într-o funcție async. Blochează tot programul; folosește await asyncio.sleep().

Comenzi înrudite

  • def: Definește o funcție: un bloc de cod cu nume, pe care îl poți apela de oricâte ori.
  • yield (generatoare): Transformă o funcție într-un generator, care produce valorile una câte una, la cerere.
  • iter() și next(): iter() obține un iterator dintr-o colecție; next() ia următorul element din iterator.
  • open() și with: Deschide un fișier pentru citire sau scriere; cu with, fișierul este închis automat.