odkkk
Python의 비동기 프로그래밍에 대한 실무 가이드
Python · · 읽는 데 1분 소요

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)

실제 적용

비동기 프로그래밍은 다음과 같은 시나리오에서 특히 유용합니다.

  1. 웹 크롤러: 다수의 동시 HTTP 요청
  2. API 호출: 여러 외부 서비스 집계
  3. 파일 IO: 다수의 파일 읽기 및 쓰기 작업
  4. 데이터베이스 쿼리: 여러 쿼리를 동시에 실행

팁: 모든 시나리오가 비동기식, CPU 집약적 작업에 적합한 것은 아니며 다중 프로세스를 사용해야 합니다.

요약

Python에서 비동기 프로그래밍을 마스터하면 IO 집약적인 애플리케이션의 성능을 크게 향상시킬 수 있습니다. 핵심은 이벤트 루프가 작동하는 방식을 이해하고, 세마포어를 적절하게 사용하여 동시성을 제어하고, 적절한 동시성 모드를 선택하는 것입니다.