파이썬 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}")
return2026-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 notifiedgather에 return_exceptions=True 주는것도 해봤는데 그건 그냥 다 끝날때까지 기다리는거라 더 오래 걸리네요. 실패하면 나머지 취소시키는 방법이 따로 있나요? 직접 task 리스트 만들어서 cancel 해야되는건지 ㅠㅠ
댓글 0