Processing math: 100%
본문 바로가기
Language/python

[FastAPI] 3. 멀티프로세싱

by _YUJIN_ 2023. 12. 6.

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이라면 28+1 로 17개의 worker thread 를 정의하면 된다. 

uvicorn main:app --host 0.0.0.0 --port 7504 --workers 17

 

실행을 하게 되면, log에 상위 프로세스에 대한 각 프로세스의 PID와 각 작업자 프로세스에 대한 PID가 표시되는 것을 볼 수 있다. 

반응형