Python Academy · leksjon

Korutiner og hendelsesløkken

Definer korutiner med async def, og kjør dem med asyncio.run().

Leksjon 1 av 413 trinn

Korutiner og hendelsesløkken er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Python Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Python Academy inneholder totalt 4 leksjoner.

Hva er samtidighet?

Asyncio tilbyr samarbeidende samtidighet: én tråd håndterer mange oppgaver ved å bytte mellom dem når en av dem venter på I/O.

# Traditional: blocking I/O holds the whole thread
# Asyncio: while waiting for I/O, run other coroutines

import asyncio

async def main():
    print("Hello")
    await asyncio.sleep(1)   # yield control
    print("World")

asyncio.run(main())

async def — Korutinefunksjoner

Funksjoner som er definert med async def, er korutinefunksjoner. Når De kaller dem, returnerer de et korutineobjekt; de kjører først når De venter på dem eller planlegger dem.

import asyncio

async def greet(name):
    return f"Hello, {name}"

result = asyncio.run(greet("Alice"))
print(result)   # Hello, Alice

Hendelsesløkken

Hendelsesløkken styrer kjøringen av korutiner. asyncio.run(coro) oppretter en ny hendelsesløkke, kjører korutinen til den er ferdig og lukker løkken.

import asyncio

async def compute():
    await asyncio.sleep(0)
    return 42

value = asyncio.run(compute())
print(value)   # 42

# For advanced use:
loop = asyncio.new_event_loop()
result = loop.run_until_complete(compute())
loop.close()

await setter kjøringen på pause

await expr setter den gjeldende korutinen på pause til expr (en annen korutine eller et future-objekt) er ferdig. Hendelsesløkken kjører andre oppgaver i mellomtiden.

import asyncio

async def task(name, delay):
    print(f"{name} starting")
    await asyncio.sleep(delay)
    print(f"{name} done")

async def main():
    await task("A", 2)
    await task("B", 1)   # sequential here

asyncio.run(main())

asyncio.sleep()

asyncio.sleep(seconds) setter den gjeldende korutinen på pause i den angitte tiden uten å blokkere hendelsesløkken.

import asyncio

async def heartbeat():
    while True:
        print("ping")
        await asyncio.sleep(1)

# asyncio.run(heartbeat())  # runs forever

asyncio.run() som inngangspunkt

asyncio.run(coro) er det vanlige inngangspunktet på øverste nivå. Kall den aldri fra en hendelsesløkke som allerede kjører.

import asyncio

async def main():
    print("running")

if __name__ == "__main__":
    asyncio.run(main())

Kontrollere om en hendelsesløkke kjører

Bruk asyncio.get_running_loop() for å oppdage om en løkke allerede kjører (utløser RuntimeError hvis ingen løkke kjører).

import asyncio

async def inner():
    loop = asyncio.get_running_loop()
    print(f"Loop: {loop}")

asyncio.run(inner())

Kjøre blokkerende kode

Kjør CPU-bundet eller blokkerende I/O-kode uten å blokkere hendelsesløkken ved hjelp av loop.run_in_executor(None, func, *args).

import asyncio, time

def blocking():
    time.sleep(2)
    return "done"

async def main():
    loop = asyncio.get_event_loop()
    result = await loop.run_in_executor(None, blocking)
    print(result)

asyncio.run(main())

Kjeding av korutiner

Korutiner kan bruke await på andre korutiner og dermed danne en kjede. Kontrollflyten går nedover i kjeden og returnerer oppover etter hvert som hvert nivå blir ferdig.

import asyncio

async def fetch_data():
    await asyncio.sleep(1)
    return {"value": 42}

async def process():
    data = await fetch_data()
    return data["value"] * 2

async def main():
    result = await process()
    print(result)   # 84

asyncio.run(main())

Identifisere korutiner

Bruk asyncio.iscoroutine(obj) eller asyncio.iscoroutinefunction(func) for å undersøke asynkrone funksjoner under kjøring.

import asyncio

async def my_coro():
    pass

print(asyncio.iscoroutinefunction(my_coro))   # True
coro = my_coro()
print(asyncio.iscoroutine(coro))              # True
coro.close()   # clean up the un-awaited coroutine

Feilsøkingsmodus for asyncio

Aktiver feilsøkingsmodus for å oppdage korutiner det ikke er brukt await på, trege tilbakekall og andre problemer: angi PYTHONASYNCIODEBUG=1 eller send debug=True til asyncio.run.

import asyncio

async def main():
    pass

asyncio.run(main(), debug=True)

# Or:
# PYTHONASYNCIODEBUG=1 python script.py

Hurtigsjekk

Hva gjør asyncio.run(coro)?

Oppsummering

Definer korutiner med async def, kjør dem med asyncio.run(), og sett dem på pause med await. Hendelsesløkken planlegger korutiner samarbeidende og kjører andre mens én venter på I/O.

Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
76
Leksjoner
320

Ofte stilte spørsmål

Er leksjonen «Korutiner og hendelsesløkken» gratis?

Ja – hele teksten i «Korutiner og hendelsesløkken» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Python Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Python Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Korutiner og hendelsesløkken»?

Definer korutiner med async def, og kjør dem med asyncio.run(). Du øver på Python Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Python Academy?

Ingen tidligere erfaring er nødvendig. Python Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Korutiner og hendelsesløkken»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Python Academy-leksjonen?

Ja. Alle Python Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Korutiner og hendelsesløkken
  2. await, oppgaver og innsamling
  3. Asynkrone kontekstbehandlere og iteratorer
  4. Mønstre for asynkron I/O i produksjon
← Tilbake til Python Academy