fastAPI는 ASGI중 한 종류인 uvicorn와 함께 비동기적인 형태로 동작한다.
* 비동기적 : 어떤 작업을 요청했을 때 그 작업이 종료될때 까지 기다리지 않고 다른 작업을 하고 있다가, 요청했던 작업이 종료되면 그에 대한 추가 작업을 수행하는 방식
* 동기적 : 어떤 작업을 요청했을 때 그 작업이 종료될때 까지 기다린 후 다음 작업을 수행하는 방식
fastAPI로 mutiprocessing을 진행하기 위해 두가지 방법으로 접근을 해봤다.
1. 리스트 형태의 입력값을 받고, 해당 값들로 병렬처리하는 방법
import time
from multiprocessing import Process
def print_sum(input):
num1 = input[0]
num2 = input[1]
time.sleep(3)
print(num1 + num2, time.ctime())
def main(inputs: list):
processes = []
for input in inputs:
process = Process(target=print_sum, args=(input,))
process.start()
processes.append(process)
# 모든 프로세스 종료를 기다림
for process in processes:
process.join()
print(process.name, process.pid, process.is_alive())
print('Done!')
if __name__ == '__main__':
inputs = [[2, 3], [4, 5], [5, 6]]
main(inputs)
2. fastapi를 배포하려고 할때 여러 코어를 활용하고, 더 많은 요청을 처리할 수 있도록 프로세스를 복제하는 방법
- uvicorn workers process를 활용할 수 있다.
- workers는 사용할 작업자 프로세스 수이고, uvicron을 실행할 때 설정해주면 된다.
- 그럼, workers는 어떻게 정의하면 될까? 사용자 환경의 CPU 코어 수에 따라 달라진다.
- 추천하는 worker 수는 ` 2 x CPU코어 수 + 1 `이다.
#-- python에서 cpu 코어 수 확인
import os
os.cpu_count() #-- 8
예를 들어, 내 환경에서의 cpu 코어 수가 8이라면 2⋅8+1 로 17개의 worker thread 를 정의하면 된다.
uvicorn main:app --host 0.0.0.0 --port 7504 --workers 17
실행을 하게 되면, log에 상위 프로세스에 대한 각 프로세스의 PID와 각 작업자 프로세스에 대한 PID가 표시되는 것을 볼 수 있다.

반응형
'Language > python' 카테고리의 다른 글
[이미지 처리] 알파채널 제거 (0) | 2024.02.06 |
---|---|
[결측값 처리] fillna / backfill / bfill / pad / ffill (0) | 2024.02.05 |
[ Pytorch ] torch 기반의 모델 저장과 불러오기 (0) | 2023.08.15 |
[FastAPI] 2. 라우팅 (0) | 2023.07.14 |
[FastAPI] 1. 시작하기 (0) | 2023.07.14 |