Korutiner og hendelsesløkken
Definer korutiner med async def, og kjør dem med asyncio.run().
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, AliceHendelseslø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 foreverasyncio.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 coroutineFeilsø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.pyHurtigsjekk
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.
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
- Korutiner og hendelsesløkken
- await, oppgaver og innsamling
- Asynkrone kontekstbehandlere og iteratorer
- Mønstre for asynkron I/O i produksjon