본문 바로가기
Develop

[Python] Fastapi 구조

by 은세라 2023. 9. 1.
fast api

파이썬으로 API를 빌드하기 위한 web framework이며 파이썬의 다른 프레임워크로는 django, flask 등이 있다.

웹 프레임워크
: 웹 클라이언트와 서버 간의 통신 모습, HTTP 요청 및 응답의 성격, 서버 측 웹 애플리케이션이 웹 브라우저의 요청에 응답하기 위해 수행해야하는 작업들이 있는데, 이 개발 작업을 단순화 하는 도구와 라이브러리를 제공

아래 그림은 어떻게 fastapi가 비동기 구조를 실행할 수 있는지에 대한 구조이다.

크게 ASGI 프레임워크인 Fastapi -> starlette -> ASGI 서버인 Uvicorn -> uvloop(cpython) 의 순서로 실행된다.

이러한 구조로 인해 fast api는 비동기 작업을 수행할 수 있고 빠른 성능을 제공할 수 있다. 여기서 gunicorn은 uvicorn 프로세스를 관리하는 프로세스이다.


https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=parkjy76&logNo=221983329279

Starlette

ASGI(Asynchronous Server Gateway Interface) 프레임워크/툴킷

사실 이 fastapi의 구조를 알아보게 된  주 원인이다. 이 Starlette을 fastapi가 한번 감싸고 있으며 이로 인해 fastapi의 개발 속도와 성능이 가능하다.  완전한 프레임워크/툴킷으로 만들어져 있기 때문에 어떤 컴포넌트라도 독립적으로 사용할 수 있다.

 

제공하는 기능은 아래와 같으며 asyncio를 필요로 한다.

- 시스템 시작 및 시스템 종료 이벤트

- requests위에 빌드된 테스트 클라이언트

- 세션 및 쿠키 지원

- CORS, GZip, 정적 파일, 스트리밍 응답

from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route


async def homepage(request):
    return JSONResponse({'hello': 'world'})


app = Starlette(debug=True, routes=[
    Route('/', homepage),
])

 

ASGI server

ASGI(비동기 서버 게이트웨이 인터페이스)라는 개념은 웹 애플리케이션과 웹 서버간의 소통을 어떤 방식으로 할 것인가에 대한 개념이다. 웹 프레임워크가 클라이언트와 "무엇을" 통신할 건가에 대해 관리한다면 ASGI는 "어떻게"에 해당하는 방식을 관리한다.

 

기존 파이썬2에서는 웹 애플리케이션과 웹 서버간의 통신에서 WSGI(웹 서버 게이트웨이 인터페이스) 표준을 따랐다. 하지만 파이썬3가 등장하고 파이썬3에서는 이전 파이썬2와 달리 여러 비동기 작업을 처리하기 위한 구문이 추가되었다. WSGI는 동기 동작을 전제로 하는 표준이기 때문에 비동기 환경에서는 적합하지 않았다. 

https://ynzu-dev.tistory.com/105

ASGI는 애플리케이션당 여러 개의 비동기 이벤트를 허용하고 동기와 비동기 모두 지원한다. 이 과정에서 eventloop를 사용해 여러 request를 비동기 순차작업으로 처리한다.

 

uvicorn

uvloops와 httptools를 사용하는 초고속 ASGI 서버

Starlette이 강력한 성능을 보장하는 이유는 내부적으로 uvicorn을 사용하고 있기 때문이다. 그리고 이 uvicorn의 성능은 libuv와 cpython에 있다. (libuv는 Node.js가 동작하는 환경이라고 하는데 fastapi가 거기까지 연관이 있다니..!)

 

또한 이 uvicorn이 ASGI이기 때문에 비동기 처리가 가능하다.

파이썬은 GIL(Gloabl Interpreter Lock)을 사용한다. 파이썬의 가비지 컬렉터에서 count하는 시점에 여러 thread에서 임계영역에 접근한다면 문제가 발생할 수 있기 때문에 다수의 thread가 있어도 하나의 thread만 CPU를 할당받아 동작한다. 근본적으로 파이썬 인터프리터에서는 비동기적인 다수의 thread를 한번에 실행하지 못하는 것이다.

https://ssungkang.tistory.com/entry/python-GIL-Global-interpreter-Lock%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

하지만 비동기적인 특성을 구현하기 위해서라면 다수의 thread를 활용해야하는데 uvicorn은 비동기를 위해 멀티 프로세싱 방식을 활용한다. 멀티 thread와 멀티 프로세싱은 "동시에 두 가지 이상의 루틴을 실행할 수 있는 역할"을 한다는 점에서 비슷해보이긴 하지만 구체적인 실행 방식에서는 차이가 있다. 이것도 파고들고자 하면 끝도 없기 때문에 간략히 정리하자면, 멀티 thread는 하나의 프로세스에서 다수의 thread를 동시에 작동시키고 thead는 공유 메모리는 가지는 한편 멀티 프로세스에서난 fork를 통해 프로세스를 복사하여 각자의 메모리 영역을 가지고 상속은 가능하지만 결국 독립적인 관계이다.

 

보통 fastapi로 코드를 작성하고 나면 아래 커맨드로 실행을 한다.

(--reload 옵션은 소스코드가 수정되면 서버를 바로 재시작하는 기능이다. )

uvicorn main:app --reload

 

별 생각없이 이거 입력하면 실행되는 구나! 정도로 생각했는데 이러한 관계성이 있을줄이야..!

사실 엄청 간략하게 찍먹만 했지만 하나하나가 중요한 개념이고 전체 웹서버가 어떻게 돌아가냐에 대한 이야기이기 때문에 기회가 된다면 각각에 대해서도 더 자세히 알아보고싶다.


참고

https://developer.mozilla.org/ko/docs/Learn/Server-side/First_steps/Web_frameworks

https://www.itworld.co.kr/news/245062

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=parkjy76&logNo=221983329279 

https://jybaek.tistory.com/890

https://m.blog.naver.com/pjt3591oo/222772705407

https://weekwith.tistory.com/entry/Starlette-%EC%86%8C%EA%B0%9C

https://you9010.tistory.com/136

https://blog.naver.com/gi_balja/223028077537

http://dveamer.github.io/backend/PythonWAS.html

'Develop' 카테고리의 다른 글

웹 개발 구조 정리  (0) 2023.09.08
로그 레벨 설정하기  (0) 2023.08.17

댓글