asyncio — 비동기 I/O

asyncio — 비동기 I/O

Hello World부터 시작해 볼게요.

import asyncio
async def main():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')
asyncio.run(main())

asyncioasync/await 문법으로 동시성 코드를 작성하는 라이브러리예요. 고성능 네트워크·웹 서버, 데이터베이스 연결 라이브러리, 분산 태스크 큐 등을 제공하는 여러 파이썬 비동기 프레임워크의 기반으로 사용돼요. 특히 I/O 바운드이면서 고수준 구조화된 네트워크 코드에 아주 잘 맞아요.

asyncioasync/await 코드를 만들기 위한 고수준 API 세트를 제공해요.

  • 파이썬 코루틴을 동시에 실행하고 그 실행을 완전히 제어
  • 네트워크 I/O와 IPC 수행
  • 서브프로세스 제어
  • 큐로 태스크 분산
  • 동시성 코드 동기화

asyncio내부 조사(introspection)용 API와 도구도 제공해요.

  • 태스크와 퓨처의 비동기 호출 그래프 검사
  • 커맨드라인 도구로 다른 실행 중인 파이썬 프로세스의 태스크 검사

라이브러리/프레임워크 개발자를 위한 저수준 API가 있어요.

  • 네트워킹·서브프로세스 실행·OS 신호 처리 등 비동기 API를 제공하는 이벤트 루프 생성·관리
  • transports로 효율적인 프로토콜 구현
  • 콜백 기반 라이브러리·코드를 async/await 문법과 연결

가용성: WASI에서는 동작하지 않아요. WebAssembly에서 이 모듈은 동작하지 않거나 사용할 수 없어요.

출처: Python documentation

본문

asyncio REPL

REPL에서 asyncio 동시성 컨텍스트를 실험해 볼 수 있어요.

$ python -m asyncio
asyncio REPL ...
Use "await" directly instead of "asyncio.run()".
>>> import asyncio
>>> await asyncio.sleep(10, result='hello')
'hello'

이 REPL은 PYTHON_BASIC_REPL과 제한적 호환이 있어요. 전체 기능과 최신 기능을 원하면 기본 REPL을 쓰는 게 좋아요. 감사 이벤트 cpython.run_stdin을 인자 없이 발생시켜요. (3.12.5에서 감사 이벤트 방출, 3.13에서 가능하면 PyREPL을 사용하고 PYTHONSTARTUP도 실행)

레퍼런스 구성

  • 고수준 API: Runners, Coroutines and tasks, Streams, Synchronization Primitives, Subprocesses, Queues, Exceptions
  • 내부 조사 API: Call graph introspection, Command-line introspection tools
  • 저수준 API: Event loop, Futures, Transports and Protocols, Policies, Platform Support, Extending
  • 가이드와 튜토리얼: High-level API Index, Low-level API Index, Developing with asyncio, asyncio and free-threaded Python

참고: asyncio의 소스 코드는 Lib/asyncio/에서 찾을 수 있어요.

더 알아보기 (Learn more)