LangChin | 병렬 비동기 처리, 빅맥세트 [asyncio.gather] | 입출력 처리

박성문·2025년 1월 10일

asyncio.gather이란

여러 비동기 작업을 동시에 실행하고 모든 작업이 끝나길 기다리는 함수이다.
동기 작업 await는 세탁기를 돌리고 종료 되면 설거지를 시작하고, 설거지를 다 한 후에 TV를 본다면
비동기 작업 asyncio는 세탁기를 돌려 놓고 TV를 보면서 설거지를 하는 것이라고 생각하면 된다.

기본 구조와 필수 문법

  • async def : 비동기 함수임을 선언
  • await : asyncio.gather이 완료될 때까지 대기
  • asyncio.gather() : 여러 코루틴을 동시에 실행하는 함수
  • results : 모든 함수의 결과가 리스트 형태로 반환됨

에러 처리

  • return_exceptions = True : 한 작업이 실패해도 다른 작업 계속 실행
  • try-except : 전체 작업의 예외 처리
  • 결과에는 성공한 값과 예외 객체가 모두 포함됨

사용 예시

  • aiohttp.ClientSession(): 비동기 HTTP 클라이언트 세션 생성
  • async with: 컨텍스트 매니저의 비동기 버전
  • await response.json(): JSON 응답을 비동기로 파싱

왜 쓰는가

여러 비동기 작업을 동시에 실행할 수 있다
전체 실행 시간을 크게 단축할 수 있다
I/O 작업을 효율적으로 처리할 수 있다
독립적인 작업들을 병렬로 처리 가능하다

장점

  • 순차 실행 (동기식 실행) 시 : 3 + 2 + 4 = 9초 소요
  • gather 사용 시 (비동기식 실행) 시 : max(3,2,4) = 4초 소요
  • 작업이 많을수록 시간 단축 효과가 커진다
  • 각 작업의 성공 / 실패 여부 확인 가능
  • 실패한 작업만 선별적으로 재시도 가능
  • 전체 작업의 상태 모니터링이 용이하다
  • 한 팀의 지연이 다른 팀에 영향을 주지 않는다.

다른 팀에 영향을 주지 않는다?

음료와 감자는 이미 준비되었지만 패티가 타버려서 패티를 다시 굽느라 패티 팀만 손해를 봤지
음료와 감자팀은 이미 메뉴를 준비하고 다음 다른 메뉴를 준비할 수 있어 영향이 없다.
버거가 늦어져도 음료 담당이 음료를 늦게 만들 필요가 없다.

1번 주문

  • 패티팀 : 패티를 태워서 다시 구움 (7분 지연)
  • 음료팀 : 30초만에 완료, 2번 주문 음료 준비 시작
  • 감자팀 : 2분 만에 완료, 2번 주문 감자 준비 시작

2번 주문

  • 패티팀 : 1번 패티가 늦어져도 2번 패티는 다른 그릴에서 정상적으로 진행
  • 음료팀 : 1번 음료 완료 후 바로 2번 음료 준비
  • 감자팀 : 1번 감자 완료 후 바로 2번 감자 준비

결과 :

  • 1번 주문 : 7분 후 세트 완성 (패티 지연)
  • 2번 주문 : 3분 후 세트 완성 (정상 진행)

이런 식으로 한 팀의 지연이 다른 팀의 주문 처리에 영향을 주지 않는 것이 asyncio.gather의 큰 장점이다.

특징

  • 병렬 실행 : 여러 작업을 동시에 시작하고 실행한다
  • 대기 시간 최소화 : I/O 바운드 작업의 경우, 한 작업이 대기 중일 때 다른 작업을 진행할 수 있다
  • 전체 실행 시간 단축 : 모든 작업을 순차적으로 실행하는 것보다 훨씬 빠르다

맥도날드에 비유하면

기본 구조


빅맥 세트를 시키면 햄버거, 음료, 감자튀김이 한 세트이기 때문에
3개의 음식이 모두 준비되어야 진동벨이 울리고 내가 음식을 가져갈 수 있다.

실제 주문 예시


내가 빅맥을 시키면, 동시에
1. 그릴에서 패티와 빵을 굽고
2. 캐셔가 음료를 준비하며
3. 튀김기에서 감자튀김을 튀긴다

에러 처리 예시

동기식으로 처리하면 (await) 패티를 다 굽고나서 빵을 굽고, 빵을 다 구우면 음료를 준비하고, 음료가 준비되면 감자튀김을 튀기기 때문에 패티는 다 식고 빅맥 세트에 엄청난 시간이 소요된다.

비동기식 (asyncio.gather)은 각 팀이 독립적으로 일하면서도 조화롭게 협업하고
주문부터 완성까지의 전체 시간이 단축된다, 피크 타임에도 효율적으로 주문 처리가 가능하고
한 파트에 문제가 생겨도 전체 운영에 차질이 최소화된다.

asyncio.gather은

여러 개의 비동기 작업을 동시에 실행하고 모든 작업이
완료될 때까지 기다렸다가 결과를 한 번에 받는 기능이다.
빅맥 세트가 나오는 것처럼 음료가 먼저 준비되어도
버거와 프라이가 모두 같이 준비되어야 진동벨이 울리는 것과 같다.
여러 작업을 병렬로 처리하고 각 작업은 서로 영향을 주지 않고 독립적으로 실행된다.

profile
성문이

0개의 댓글