Python의 비동기 프로그래밍에 대한 실무 가이드
Python asyncio의 핵심 개념을 깊이 이해하고, 비동기 프로그래밍의 모범 사례를 숙지하고, 크롤러 및 IO 집약적 작업의 성능을 향상시킵니다.
비동기 프로그래밍의 기본
Python의 asyncio 모듈은 비동기 코드를 동기 코드처럼 읽을 수 있도록 async/await 구문을 사용하여 동시 코드 작성을 위한 인프라를 제공합니다.
핵심 개념
- 이벤트 루프: 이벤트 루프, 비동기 프로그램의 실행 엔진
- 코루틴: 코루틴,
async def를 사용하여 정의된 함수 - 태스크: 동시 스케줄링에 사용되는 코루틴 캡슐화인 태스크
- 미래: 완료되지 않은 작업을 나타내는 미래 결과
기본 사용법
import asyncio
async def fetch_data(url: str) -> str:
"""模拟异步 HTTP 请求"""
await asyncio.sleep(1)
return f"Data from {url}"
async def main():
# 串行执行:耗时 3 秒
result1 = await fetch_data("https://api1.com")
result2 = await fetch_data("https://api2.com")
result3 = await fetch_data("https://api3.com")
# 并发执行:耗时 1 秒
results = await asyncio.gather(
fetch_data("https://api1.com"),
fetch_data("https://api2.com"),
fetch_data("https://api3.com"),
)
asyncio.run(main())
동시성 제어: 세마포어
동시성 수를 제한해야 하는 경우 asyncio.Semaphore가 최선의 선택입니다.
async def crawl_with_limit(urls: list[str], limit: int = 10):
semaphore = asyncio.Semaphore(limit)
async def fetch(url: str):
async with semaphore:
return await fetch_data(url)
tasks = [fetch(url) for url in urls]
return await asyncio.gather(*tasks)
실제 적용
비동기 프로그래밍은 다음과 같은 시나리오에서 특히 유용합니다.
- 웹 크롤러: 다수의 동시 HTTP 요청
- API 호출: 여러 외부 서비스 집계
- 파일 IO: 다수의 파일 읽기 및 쓰기 작업
- 데이터베이스 쿼리: 여러 쿼리를 동시에 실행
팁: 모든 시나리오가 비동기식, CPU 집약적 작업에 적합한 것은 아니며 다중 프로세스를 사용해야 합니다.
요약
Python에서 비동기 프로그래밍을 마스터하면 IO 집약적인 애플리케이션의 성능을 크게 향상시킬 수 있습니다. 핵심은 이벤트 루프가 작동하는 방식을 이해하고, 세마포어를 적절하게 사용하여 동시성을 제어하고, 적절한 동시성 모드를 선택하는 것입니다.