def → async def 변환 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
1. 현재 상황
- 모든 라우터가 def로 되어 있음
- 비동기 I/O 작업이 있는 경우에는 async def로 변환하는게 적절하다 판단
- 각각의 라우터에서 이루어지는 작업을 분석하여 async def와 def를 적절히 설정하기
2. async def vs def
- i/o 작업이 있는 경우 async def가 적절하다.
- 반면 cpu 작업만 있는데 async def를 이용할 경우, 불필요한 오버헤드가 발생한다.
- async def 함수는 코루틴 객체를 반환하고, 실행에 오버헤드가 존재한다.
3. 진행 방안
- 버킷에 이미지 로딩해두고 이미지 로딩을
- 로컬 테스트용(다양한 데이터셋을 빠르게 테스트해보기 위함)
- 버킷 테스트용 분리
- 버킷에서 이미지 로딩하는 거 구현할 때, 비동기 처리 적절하게 작성
→ 이때, 라우터 async def로 바꿔야 하는 부분 수정
- 로컬 테스트를 위한 로컬 테스트, 버킷 실행 로직 분리 작업
4. 진행 순서
a. 로컬 테스트 로직을 분리한다.
- base image loader 클래스를 만들고 gcs, s3, local image loader 클래스가 베이스 클래스를 상속하는 형태로 구현한다.
- 서버 띄울 때, 이미지 로더를 만들고 재사용한다.
- 컨트롤러는 이미지 로더 객체를 활용해 load_images 메서드로 이미지를 받아온다.
b. 버킷에 이미지를 로딩한다.
c. 버킷 실행 로직을 구현한다.
- 서버 띄울 때 선택한 이미지 로딩 방식으로 이미지 로더를 만들어야 한다.
- 환경 변수로 이미지 로딩 방식을 선택한다 (디폴트는 gcs)
- 서버 띄워질 때, 해당 이미지 로더 객체가 만들어진다
- 서버에 요청이 오면 해당 이미지 로더로 이미지를 가져온다
d. 로컬/버킷 이미지 로딩 로직의 비동기 처리를 개선한다.
- 로컬 이미지 로딩 함수와 버킷 이미지 로딩 함수를 쓰레드풀로 병렬 처리한다
- 병렬 처리 결과를 받기 위해서는 await으로 기다려야 한다
- await으로 기다리기 위해서는 load_images 메서드가 async def로 정의되어 있어야 한다
- load_images는 비동기 메서드이므로 load_images를 호출하는 부분에서도 await이 사용되어야 하고 그 함수도 async def로 정의되어야 한다