본문으로 건너뛰기
김신건의 로그

[Python] asyncio: 비동기 프로그래밍

· 수정 · 📖 약 1분 · 182자/단어 #python #async #asyncio
py-async-await, python-asyncio, asyncio, 파이썬 비동기, async python

정의

asyncio 는 Python 의 표준 비동기 I/O 라이브러리 (3.4+). event loop 위에서 coroutine 을 스케줄링.

기본

import asyncio

async def fetch(url):
    await asyncio.sleep(1)
    return f"result for {url}"

async def main():
    result = await fetch("https://example.com")
    print(result)

asyncio.run(main())

병렬 실행

gather

async def main():
    results = await asyncio.gather(
        fetch("url1"),
        fetch("url2"),
        fetch("url3"),
    )

세 요청이 병렬 실행, 결과 순서는 인자 순서와 동일.

as_completed

async def main():
    tasks = [fetch(u) for u in urls]
    for future in asyncio.as_completed(tasks):
        result = await future
        print(result)  # 완료된 순서

Task 생성

task = asyncio.create_task(fetch(url))
# ...다른 일...
result = await task

Semaphore 로 동시 실행 제한

sem = asyncio.Semaphore(10)

async def limited_fetch(url):
    async with sem:
        return await fetch(url)

함정

  • 동기 코드 블로킹: time.sleep() 대신 await asyncio.sleep(). 다른 블로킹 함수는 run_in_executor 로.
  • event loop 하나: asyncio.run() 을 중첩하면 안 됨. Jupyter 는 이미 loop 있어서 다른 처리 필요.
  • 취소 처리: asyncio.CancelledError 반드시 전파

실전 라이브러리

  • aiohttp: HTTP client/server
  • asyncpg: PostgreSQL
  • motor: MongoDB
  • httpx (async mode)
  • FastAPI, Starlette: 웹 프레임워크

참고

이 개념을 다룬 위키 페이지 (1)

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기