본문 바로가기
Q&A해결2026년 10월 9일2분 읽기

asyncio.gather 하나 실패해도 나머지 태스크가 계속 돌아요

h
hwlee_dev
조회 148댓글 4

파이썬 3.11 이고 쇼핑몰 여러개 API에서 주문 긁어오는 배치를 asyncio + httpx로 짜고 있는데요.

gather로 40개 정도 샵을 동시에 돌리는데 하나가 타임아웃 나면 예외는 바로 올라와서 except로 들어가긴 합니다. 근데 로그 보면 그 뒤에도 나머지 태스크들이 계속 돌면서 DB 저장까지 해버려요.. 저는 하나라도 실패하면 전부 멈추고 싶거든요.

async def main():
    async with httpx.AsyncClient(timeout=10) as client:
        try:
            results = await asyncio.gather(*(sync_shop(client, s) for s in shops))
        except Exception as e:
            logger.error("sync failed: %r", e)
            await notify_slack(f"주문 동기화 실패: {e!r}")
            return
2026-10-09 12:41:07,512 ERROR sync failed: ReadTimeout('')
2026-10-09 12:41:07,690 INFO  saved 112 orders shop=17
2026-10-09 12:41:08,034 INFO  saved 64 orders shop=23
2026-10-09 12:41:08,211 INFO  saved 9 orders shop=31
2026-10-09 12:41:08,902 INFO  slack notified

gather에 return_exceptions=True 주는것도 해봤는데 그건 그냥 다 끝날때까지 기다리는거라 더 오래 걸리네요. 실패하면 나머지 취소시키는 방법이 따로 있나요? 직접 task 리스트 만들어서 cancel 해야되는건지 ㅠㅠ

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록