[Open WebUI] asyncio.gather로 이미지 로딩 병렬화하여 지연시간 단축
PR 링크: open-webui/open-webui#20911 상태: Merged | 변경: +2 / -1
들어가며
이미지 편집 API에서 여러 장의 이미지를 처리할 때, 각 이미지를 순차적으로 로딩하면 이미지 수에 비례하여 대기 시간이 증가합니다. 5장의 이미지를 각각 1초씩 로딩한다면 총 5초가 걸리는 것입니다. 이 PR은 Python의 asyncio.gather()를 사용하여 모든 이미지를 동시에 로딩하도록 변경합니다.
핵심 코드 분석
순차 로딩에서 병렬 로딩으로
Before:
form_data.image = [await load_url_image(img) for img in form_data.image]
After:
# Load all images in parallel for better performance
form_data.image = list(await asyncio.gather(*[load_url_image(img) for img in form_data.image]))
리스트 컴프리헨션 안에서 await를 호출하면, 각 load_url_image가 완료될 때까지 기다린 후 다음 이미지 로딩이 시작됩니다. asyncio.gather()로 감싸면 모든 코루틴이 동시에 스케줄링되어, I/O 대기 시간이 겹치게 됩니다.
왜 이게 좋은가
- 지연시간 단축: N개의 이미지를 로딩할 때, 전체 소요 시간이
sum(각 이미지 로딩 시간)에서max(각 이미지 로딩 시간)으로 줄어듭니다. - CPU 부하 없음: I/O 바운드 작업이므로 추가 스레드나 CPU 리소스 없이 성능이 향상됩니다.
- 단 1줄 변경:
asyncio.gather()라는 표준 라이브러리 패턴만 적용하여, 코드 복잡도 증가 없이 성능을 개선했습니다. - 에러 처리 유지: 기존의
try-except블록이 그대로 유지되어 안정성에 영향을 주지 않습니다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [Open WebUI] 검색 쿼리 디바운스 적용으로 불필요한 DB 요청 감소
- 현재글 : [Open WebUI] asyncio.gather로 이미지 로딩 병렬화하여 지연시간 단축
- 다음글 [CPython] subprocess.Popen.wait() 이벤트 기반 구현으로 효율성 개선
댓글