async와 await는 「비동기 함수」를 표현하는 두 키워드입니다.
보기엔 단순하지만 일반 함수와 동작 방식이 매우 다릅니다 — 호출해도 즉시 실행되지 않고 「코루틴 객체」가 반환됩니다.
async def.
async def fetch(url): ...
— 비동기 함수 선언.
일반 def와 달리 함수 자체가 「실행 가능한 객체」를 반환.
fetch(url)을 부르면 코드가 안 돌고 코루틴 객체만 만들어짐.
await.
result = await fetch(url) — 코루틴을 실행하고 결과 받기.
await는 「이 작업이 끝날 때까지 기다리되, 그동안 이벤트 루프는 다른 일 처리해도 됨」 의미.
await는 async 함수 안에서만 사용 가능.
이벤트 루프.
asyncio.run(main()) — 이벤트 루프 시작 → main 실행 → 끝나면 루프 종료.
안에서 await를 만나면 「양보」 → 루프가 다른 준비된 태스크 실행.
협력적(cooperative) 멀티태스킹.
흔한 실수.
fetch(url)만 부르고 await 안 함 → 「코루틴 객체 반환」 경고만 뜨고 실제로는 안 실행됨.
async 함수 안에서 일반 함수처럼 호출하려면 항상 await 또는 asyncio.create_task(...) 필요.
한 줄 요약
async def는 비동기 함수 선언, await는 결과 기다리기(다른 작업에 양보).
asyncio.run으로 이벤트 루프 시작.
await 빠뜨리면 실행 안 됨.
더 알아볼 것
- 코루틴 — 일반 함수와의 차이
- await 가능한 객체 — Awaitable
- async with·async for