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() 의 반환값을 저장하지 않으면 태스크가 가비지 컬렉션될 수 있고, 예외도 무시됩니다.
Continue Learning
Python 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.