asyncio — 비동기 I/O

asyncio — 비동기 I/O (Asynchronous I/O)

asyncioasync/await 문법으로 동시성 코드를 작성하는 라이브러리예요. 고성능 네트워크·웹 서버, 데이터베이스 연결 라이브러리, 분산 작업 큐 등을 제공하는 여러 Python 비동기 프레임워크의 기반으로 쓰여요.

출처: Python 표준 라이브러리

본문

asyncioasync/await 문법을 사용해 동시성 코드를 작성하는 라이브러리예요. 여러 Python 비동기 프레임워크가 asyncio를 기반으로 만들어져요. 이 프레임워크들은 고성능 네트워크·웹 서버, 데이터베이스 연결 라이브러리, 분산 작업 큐 등을 제공하죠. asyncio는 IO-bound이고 고수준으로 구조화된 네트워크 코드에 종종 완벽하게 맞아요.

더 알아보기A Conceptual Overview of asyncio 에 asyncio의 기초 설명이 있어요.

asyncio는 다음을 할 수 있는 고수준 API 세트를 제공해요.

  • Python 코루틴을 동시에 실행하고 그 실행을 완전히 제어
  • 네트워크 IO와 IPC 수행
  • 서브프로세스 제어
  • 큐를 통한 작업 분배
  • 동시성 코드 동기화

들여다보기(introspection)를 위해 asyncio는 다음을 위한 API와 도구를 제공해요.

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

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

  • 이벤트 루프를 만들고 관리 — 네트워킹, 서브프로세스 실행, OS 신호 처리 등을 위한 비동기 API 제공
  • transport를 사용한 효율적인 프로토콜 구현
  • 콜백 기반 라이브러리·코드를 async/await 문법과 연결

가용성: WASI가 아님. 이 모듈은 WebAssembly에서 동작하지 않거나 사용할 수 없어요. 자세한 내용은 WebAssembly platform을 보세요.

asyncio REPL

인터랙티브 REPL에서 asyncio 동시성 문맥을 실험해 볼 수 있어요.

$ python -m asyncio
asyncio REPL ...
Use "await" directly instead of "asyncio.run()".
Type "help", "copyright", "credits" or "license" for more information.
>>> import asyncio
>>> await asyncio.sleep(10, result='hello')
'hello'

이 REPL은 PYTHON_BASIC_REPL과 제한된 호환성을 제공해요. 전체 기능과 최신 기능을 위해 기본 REPL을 사용하는 걸 권장해요. 인자 없는 cpython.run_stdin 감사 이벤트를 발생시켜요.

3.12.5 버전 변경: (3.11.10, 3.10.15, 3.9.20, 3.8.20에서도) 감사 이벤트를 발생시켜요. 3.13 버전 변경: 가능하면 PyREPL을 사용하고, 그 경우 PYTHONSTARTUP도 실행돼요.

더 알아보기

asyncio에 대한 자세한 참고 자료입니다. 다음 항목들이 분리된 페이지로 제공돼요.

  • 고수준 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, Guides and Tutorials, High-level API Index, Low-level API Index, Developing with asyncio, asyncio and free-threaded Python

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