-
앞으로는 FastAPI를 Uvicorn + Gunicorn 쌍두마차로 활용하자computer science 2023. 6. 27. 15:30반응형
FastAPI는 Python에서 고성능, 쉽고 빠른(프로그래밍의 측면에서), 웹 API를 구축하는데 사용되는 현대적인, 빠른(실행 시간의 측면에서), 웹 프레임워크다. 이는 데이터 유효성 검사, 직렬화, 문서화 등을 다루는데 있어 매우 유용하며, 이 모든 것들이 본질적으로 표준 Python 타입 힌트에 기반을 두고 있다.
FastAPI를 실제로 실행하려면 ASGI 서버가 필요한데, 이 때 가장 일반적으로 사용되는 것이 uvicorn이다.반응형Uvicorn이란?
Uvicorn은 ASGI 서버이며, 초고속 ASGI 서버에 본질적으로 필요한 것들만을 제공한다. Uvicorn은 uvloop와 httptools를 활용하여 빠른 HTTP 요청 처리를 가능하게 한다. 이는 Python에서 웹 서버를 만드는 과정에서의 주요 병목현상인 네트워크 I/O 처리를 최적화하는 것을 목표로 하고 있다.
Uvicorn을 사용하면 다음과 같은 명령어로 FastAPI 애플리케이션을 실행할 수 있다.uvicorn main:app --reload
여기서 main은 Python 파일(main.py)을 의미하고, app는 FastAPI 인스턴스를 나타낸다. --reload 플래그는 개발 중 코드 변경을 감지하고 서버를 자동으로 재시작하는 기능을 활성화한다.
Uvicorn의 한계
그러나 uvicorn 만으로는 웹 애플리케이션을 확장하거나 여러 작업자(worker)를 통해 애플리케이션을 구동하는 것이 어렵다. 또한 uvicorn은 기본적으로 하나의 작업자에서만 실행되므로, 여러 CPU 코어를 활용하는 등의 병렬처리를 위해서는 다른 방법이 필요하다.
반응형Gunicorn과의 병행 사용
이러한 uvicorn의 한계를 극복하기 위해 gunicorn을 병행 사용한다. Gunicorn은 WSGI HTTP 서버로, Python 웹 애플리케이션을 병렬로 처리할 수 있는 Pre-fork 워커 모델을 지원한다. gunicorn과 uvicorn을 함께 사용하면, FastAPI 애플리케이션을 여러 작업자로 분산하여 처리하고, 동시에 다수의 HTTP 요청을 빠르게 처리할 수 있다. (공식 FastAPI 문서에서도 권장하는 설정이다) 이를 통해 uvicorn의 단점을 Gunicorn으로 보완하고 서버의 성능을 더욱 향상시킬 수 있다.
Gunicorn과 Uvicorn을 함께 사용하는 방법은 다음과 같다.
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app
여기서 -w 4는 4개의 워커를 사용하겠다는 것을 의미이고, -k uvicorn.workers.UvicornWorker는 uvicorn 워커를 사용하겠다는 것을 나타낸다. 마지막의 main:app는 uvicorn을 실행할 때 사용한 것과 동일하게, Python 파일과 FastAPI 인스턴스를 의미한다.
이처럼 FastAPI에 Uvicorn과 Gunicorn을 활용하면 서버의 리소스의 사용을 더 효율적으로 사용할 수 있을 것이다.
더 자세한 내용은 fastapi문서를 참고하길 바란다.
FastAPI에서 Redis를 비동기로 사용하도록 설정하기
필자는 Flask로 주로 개발하다가 FastAPI로 넘어오면서 가장 곤혹을 치뤘던것이 바로 비동기처리로 모든 코드를 변경하고 적응하는 것이었다. 이미 검색하면 답이 다 나와있지만 그럼에도 기록차
stocktrees.com
반응형삼성과 애플. 둘다 투자하기엔 글렀다?
과거 스마트폰 양대산맥으로 팽팽했던 삼성과 애플. 현재는 1% 차이로 삼성이 스마트폰 시장 점유율을 앞서고 있다. 하지만 투자성적으로는 정반대의 상황이다. 애플은 승승장구하며 사상최고
stocktrees.com
반응형'computer science' 카테고리의 다른 글
Triton server memory leak (메모리 릭) malloc설정을 바꿔보자 (0) 2024.05.13 ChatGPT + Code Interpreter 세팅 & 시각화 잘하려면 알아야 할 5가지! (0) 2023.07.16 Python Code for Dictionary Dot Accessible & Nested Key Handling (0) 2023.06.24 FastAPI에서 Redis를 비동기로 사용하도록 설정하기 (0) 2023.06.17