asyncio는 「IO 대기 시간을 다른 일에 활용」하는 파이썬 표준 라이브러리입니다.
한 스레드 안에서도 「네트워크 응답 기다리는 동안 다른 요청 처리」가 가능 — 단일 프로세스로도 수천·수만 동시 연결을 다룰 수 있습니다.
동기 코드의 한계.
import requests; for url in urls: requests.get(url) — 한 요청이 끝나야 다음 시작.
100개 URL을 1초씩 받으면 100초.
99초는 「응답 기다리며 멍 때리는」 시간.
비동기로 풀기.
async def fetch(url): async with session.get(url) as r: return await r.text().
asyncio.gather(*[fetch(u) for u in urls])로 모두 동시 시작.
응답 기다리는 동안 다른 요청도 진행 → 100초 → 1~2초.
어디에 효과적인가.
IO 바운드 작업(네트워크·디스크) — 효과 큼.
CPU 바운드(이미지 변환·머신러닝) — 효과 거의 없음(스레드도 마찬가지).
CPU는 multiprocessing이 답.
함정 — 「하나라도 동기면 전체 멈춤」.
async 함수 안에서 일반 requests.get(긴 동기 호출)을 부르면 그 시간 동안 이벤트 루프가 멈춤 → 다른 일 못 함.
비동기로 가려면 모든 IO를 async 라이브러리로(aiohttp, asyncpg 등).
한 줄 요약
asyncio는 IO 대기 시간을 활용해 단일 스레드로 수천 동시 연결을 처리.
IO 바운드에 매우 효과적, CPU 바운드는 multiprocessing.
「한 곳이라도 동기면 전체 멈춤」 주의.
더 알아볼 것
- IO 바운드 vs CPU 바운드
- async 라이브러리 선택
- 트리오·anyio — 대안 라이브러리