정지용
기술스택 목록
백엔드

Asyncio

프로젝트 1에서 사용했습니다. 각 프로젝트에서 어떤 역할로 썼는지 아래에 정리했습니다.

이 기술은 무엇인가요?

Python에서 단일 스레드로 동시성을 구현하는 비동기 I/O 표준 라이브러리

asyncio는 Python 3.4부터 표준 라이브러리에 포함된 비동기 프로그래밍 프레임워크입니다. 네트워크 요청, 파일 I/O, 데이터베이스 쿼리 등 대기 시간이 긴 작업을 처리할 때, 멀티스레드 없이도 여러 작업을 동시에 실행할 수 있게 해줍니다. 이벤트 루프를 기반으로 작업을 스케줄링하며, async/await 문법을 통해 비동기 코드를 동기 코드처럼 직관적으로 작성할 수 있습니다.

이럴 때 사용합니다

  • 웹 API 호출, 데이터베이스 쿼리 등 I/O 대기 시간이 긴 작업이 많을 때
  • 웹소켓, SSE 등 다수의 클라이언트 연결을 동시에 처리해야 할 때
  • 멀티스레드의 복잡성 없이 동시성을 구현하고 싶을 때
  • FastAPI, aiohttp 등 비동기 기반 프레임워크를 사용할 때

핵심 개념

Event Loop
비동기 작업들을 관리하고 실행하는 핵심 메커니즘입니다. 대기 중인 작업들을 순회하며 실행 가능한 작업을 찾아 실행하고, I/O 완료를 감지해 중단된 작업을 재개합니다.
Coroutine
async def로 정의된 함수로, 실행 중 await 키워드를 만나면 중단되었다가 나중에 재개될 수 있습니다. 일반 함수와 달리 호출 시 즉시 실행되지 않고 코루틴 객체를 반환합니다.
await
비동기 작업의 완료를 기다리는 키워드입니다. await를 만나면 해당 작업이 완료될 때까지 제어권을 이벤트 루프에 돌려주고, 그 사이 다른 작업이 실행될 수 있습니다.
Task
코루틴을 이벤트 루프에서 동시에 실행하기 위한 래퍼입니다. asyncio.create_task()로 생성하면 코루틴이 즉시 스케줄링되어 백그라운드에서 실행됩니다.
Future
아직 완료되지 않은 비동기 작업의 결과를 나타내는 객체입니다. Task의 기반 클래스이며, 콜백을 등록하거나 결과를 대기하는 데 사용됩니다.

여러 HTTP 요청을 동시에 처리하는 예시

3개의 HTTP 요청을 순차적으로 기다리지 않고 동시에 보내 전체 실행 시간을 단축합니다. asyncio.gather()로 여러 Task를 동시에 실행하고 모든 결과를 수집합니다.

Python
import asyncio
import aiohttp

async def fetch_url(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    urls = [
        'https://example.com',
        'https://example.org',
        'https://example.net'
    ]
    
    async with aiohttp.ClientSession() as session:
        # 3개 요청을 동시에 실행
        tasks = [fetch_url(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
        
    print(f"총 {len(results)}개 페이지 다운로드 완료")

# 이벤트 루프 실행
asyncio.run(main())

처음 쓸 때 흔한 함정

  • async 함수 안에서만 await를 사용할 수 있습니다. 일반 함수에서는 불가능합니다
  • CPU 집약적 작업(이미지 처리, 암호화)은 asyncio로 빨라지지 않습니다
  • 동기 라이브러리를 await 없이 호출하면 이벤트 루프가 블로킹됩니다

위 개요는 기술 학습을 돕기 위해 자동 생성된 일반 설명입니다. 정확한 사양과 최신 정보는 공식 문서를 확인하세요.

프로젝트별 활용 방식

위 개념이 실제 프로젝트에서 어떻게 쓰였는지 보여줍니다.

함께 사용한 기술

위 프로젝트들에서 같이 쓰인 다른 기술입니다.