파이썬 가이드 15 비동기 프로그래밍
비동기 프로그래밍
파이썬 비동기 프로그래밍은 프로그램이 특정 작업을 기다리는 동안 다른 작업을 수행할 수 있도록 하여 효율성을 높이는 프로그래밍 방식입니다. 특히 파일 읽기/쓰기, 네트워크 요청과 같은 I/O 바운드 작업에서 유용합니다.
주요 개념:
- *
asyncio모듈:* 파이썬의 표준 라이브러리로, 비동기 프로그래밍을 위한 기반과 API를 제공합니다. 이벤트 루프, 코루틴, 태스크 등을 관리합니다. -
*
async및await키워드:*async def: 비동기 함수(코루틴)를 선언할 때 사용합니다.await:async함수 내에서 사용되며, 다른 비동기 작업이 완료될 때까지 현재 코루틴의 실행을 일시 중지하고, 그동안 이벤트 루프가 다른 작업을 실행할 수 있도록 제어권을 넘깁니다.
- 코루틴 (Coroutine):
async def로 정의된 함수로, 실행을 일시 중지하고 나중에 다시 시작할 수 있는 특별한 종류의 함수입니다. - 이벤트 루프 (Event Loop): 비동기 작업들을 관리하고 실행을 조율하는 핵심 요소입니다. 하나의 작업이 I/O 등으로 기다리는 동안 다른 작업을 수행하고, 기다리던 작업이 준비되면 다시 돌아와 처리합니다.
- 태스크 (Task): 코루틴을 이벤트 루프에서 실행할 수 있도록 스케줄링하는 역할을 합니다.
비동기 프로그래밍의 장점:
- 효율성: I/O 작업으로 인한 대기 시간 동안 다른 작업을 처리하여 프로그램의 전체적인 효율성을 높입니다.
- 동시성: 단일 스레드에서도 여러 작업을 동시에 진행하는 것처럼 보이게 합니다. 파이썬의 GIL(Global Interpreter Lock)로 인해 진정한 CPU 병렬 처리는 어렵지만, 비동기 프로그래밍은 I/O 바운드 작업에서 높은 효율을 보입니다.
활용 분야:
- 웹 개발: 고성능 웹 서버 및 API 개발에 사용됩니다. FastAPI, Sanic, Starlette, AIOHTTP와 같은 비동기 웹 프레임워크가 있습니다.
- 데이터베이스 연동:
asyncpg와 같은 라이브러리를 사용하여 비동기적으로 데이터베이스 작업을 처리할 수 있습니다. - 네트워크 통신: 비동기 I/O를 통해 네트워크 요청을 효율적으로 처리합니다.
- 분산 작업 큐: 작업을 효율적으로 분산하고 처리하는 데 활용됩니다.
주의사항:
async함수 내에서await를 사용하지 않고 동기적인 블로킹 작업을 수행하면 비동기 프로그래밍의 이점을 잃을 수 있습니다.time.sleep()대신asyncio.sleep()을 사용해야 합니다.async함수를 호출할 때await를 사용하지 않으면 코루틴 객체만 반환되고 함수가 실행되지 않을 수 있습니다.