PHpullh
학습 라이브러리/Python/비동기 디버깅

PYTHON · 비동기

비동기 디버깅

비동기 코드의 일반적인 문제를 진단하고 디버깅하는 기법입니다.

비동기고급debug디버깅비동기asyncio

핵심 설명

비동기 코드의 일반적인 문제를 진단하고 디버깅하는 기법입니다.

Python code

import asyncio
import traceback

# 디버그 모드 활성화
# PYTHONASYNCIODEBUG=1 python script.py

async def buggy_task():
    await asyncio.sleep(0.1)
    return 42

async def main():
    # 1. await 빠뜨린 코루틴 감지
    # buggy_task()  # RuntimeWarning: coroutine was never awaited
    result = await buggy_task()
    print(f"결과: {result}")

    # 2. 태스크 모니터링
    async def monitored_task(name, delay):
        await asyncio.sleep(delay)
        return f"{name} 완료"

    tasks = [
        asyncio.create_task(monitored_task("A", 0.5), name="Task-A"),
        asyncio.create_task(monitored_task("B", 1.0), name="Task-B"),
    ]

    # 현재 실행 중인 태스크 확인
    all_tasks = asyncio.all_tasks()
    for t in all_tasks:
        print(f"  태스크: {t.get_name()}, done={t.done()}")

    await asyncio.gather(*tasks)

    # 3. 타임아웃으로 교착 감지
    async def maybe_deadlock():
        await asyncio.sleep(10)

    try:
        await asyncio.wait_for(maybe_deadlock(), timeout=1.0)
    except asyncio.TimeoutError:
        print("교착 상태 가능성 감지 (타임아웃)")

    # 4. 예외 추적 개선
    async def failing():
        raise RuntimeError("비동기 에러")

    task = asyncio.create_task(failing())
    try:
        await task
    except RuntimeError:
        print(f"스택 트레이스:\n{traceback.format_exc()[:200]}")

asyncio.run(main())

학습 팁

asyncio.create_task(coro, name="이름")으로 태스크에 이름을 부여하면 디버깅이 쉬워집니다.

주의할 점

create_task()의 반환값을 저장하지 않으면 태스크가 가비지 컬렉션될 수 있고, 예외도 무시됩니다.

자주 묻는 질문

비동기 디버깅란 무엇인가요?

비동기 코드의 일반적인 문제를 진단하고 디버깅하는 기법입니다.

비동기 디버깅 학습 시 주의할 점은 무엇인가요?

create_task() 의 반환값을 저장하지 않으면 태스크가 가비지 컬렉션될 수 있고, 예외도 무시됩니다.