서버 운영 중 여러 외부 API로부터 데이터를 동시에 가져와 처리하는 로직을 구현하고 있습니다. asyncio.gather를 사용하여 비동기 요청을 병렬로 처리하고 있습니다.
코드:
import asyncio
async def fetch_data(id):
if id == 2:
raise ValueError("API Error occurred")
return f"Data {id}"
async def main():
tasks = [fetch_data(i) for i in range(1, 4)]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())
오류: ValueError: API Error occurred
시도: try-except 문으로 fetch_data 함수 내부를 감싸보았으나, 개별 태스크의 성공 여부와 관계없이 모든 결과를 리스트로 안전하게 받아오고 싶습니다.
질문: asyncio.gather 호출 시 return_exceptions 옵션을 True로 설정하면 예외가 발생한 태스크의 결과값이 어떻게 처리되어 반환되는지 궁금합니다.
댓글14
-
빗방울
2026.10.30 03:36
-
빗방울
2026.10.30 05:01
맞음ㅋㅋ
그렇게 처리하는 게 젤 깔끔함
아니면 아예 return_exceptions 안 쓰고 개별 태스크에 try-except 박는 방법도 있긴 한듯
-
빗방울
2026.10.30 09:59
맞음ㅋㅋ
그냥 for문 돌리면서 isinstance로 거르면 됨
그게 제일 무난한 방법인 듯함ㅋㅋ
-
빗방울
2026.10.30 05:33
근데 태스크 너무 많으면 gather보다 asyncio.as_completed나 TaskGroup 쓰는 게
더 효율적일 수도 있을 듯ㅋㅋ 참고해보세요
-
빗방울
2026.10.30 06:11
파이썬 3.11 쓰시면 TaskGroup 쓰는 게 요즘 트렌드긴 한데 일단 급하신 거면 그냥 return_exceptions=True 가 젤 편하실 듯ㅋㅋ
-
빗방울
2026.10.30 06:56
결과 리스트 인덱스가 원래 tasks 순서 그대로 유지되니까 그거 이용해서 매핑하면 처리하기 편하실 거임ㅋㅋ
-
빗방울
2026.10.30 08:01
로그 찍어보시면 에러 객체 그대로 들어와 있을 텐데 그거 나중에 로깅 처리할 때 편하긴 하더라고요ㅋㅋ 굿럭입니다!
-
빗방울
2026.10.30 08:57
맞아요ㅋㅋ
에러 객체 통째로 들고 있으면 나중에 디버깅할 때 진짜 편함ㅋㅋ
-
빗방울
2026.10.30 10:05
ㄹㅇㅋㅋ 에러 객체 따로 모아서 한꺼번에 슬랙으로 쏴주거나 하면 운영할 때 진짜 편하더라고요ㅋㅋ
-
빗방울
2026.10.30 10:33
ㄹㅇㅋㅋ 나중에 로그 분석할 때 어떤 API에서 터졌는지 바로 알 수 있어서 개꿀임ㅋㅋ
-
빗방울
2026.10.30 10:29
아 그리고 타임아웃 설정도 같이 하시는 거 추천함ㅋㅋ
외부 API 쓰시는 거면 가끔 응답 안 오고 무한 대기 타는 경우 있는데 ㄷㄷ
asyncio.wait_for 같은 거로 제한 걸어두면 더 안전할 듯함ㅋㅋ
-
빗방울
2026.10.30 10:40
ㄹㅇㅋㅋ 타임아웃 안 걸어두면 서버 하나가 같이 뻗어버리는 대참사 남ㅋㅋ
wait_for 필수임ㄷㄷ
-
빗방울
2026.10.30 10:59
근데 API 호출 횟수가 많으면 semaphore 같은 걸로 동시성 제한 안 걸면 상대 서버에서 차단 때릴 수도 있음ㅋㅋ 그것도 같이 고려해보세요ㅋㅋ
-
빗방울
2026.10.30 11:02
ㄹㅇㅋㅋ 세마포어 안 쓰면 바로 429 에러 뜨고 IP 차단당하는 거 한순간임ㄷㄷ 꼭 설정하시길ㅋㅋ
모든 이야기1465
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
return_exceptions=True 하면 에러 난 놈만 Exception 객체로 들어오고 나머지는 정상 결과값으로 나올 거예요ㅋㅋ 결과 리스트 돌면서 isinstance로 체크하면 될 듯함