KJH
GIL, ASGI, Uvicorn(/w fastapi) 본문
Python은 다른 언어에 비해 쉽고 직관적이어서 접근성이 뛰어나다.
특히 머신러닝이나 데이터 분야에서는 사실상 대체 불가능한 핵심 언어로 자리 잡았다.
하지만 웹 개발 측면에서는 여전히 몇 가지 제약이 존재한다.
쉽고 편리하다는 장점 뒤에는 시스템적인 제한이 따르며, 개발자 입장에서는 자유도가 낮다고 느껴질 수 있다.
물론 이러한 한계를 극복하기 위해 버전이 거듭될수록 많은 부분이 개선되고 있긴하다.
GIL(Global Interpreter Lock)
하나의 파이썬 프로세스 내에서 한 번에 하나의 쓰레드만 실행되도록 강제하는 락(Lock)이다.
멀티스레딩을 사용해도 동시에 여러 쓰레드가 Python 코드를 실행하지 못한다.
python 내부적으로 메모리 관리를 위해 레퍼런스 카운팅을 한다.
다수의 쓰레드가 동시에 객체를 수정하면 충돌을 발생 시키기 때문인데
특정 객체의 reference count가 0이 되면 객체의 메모리 할당이 해제되는 식으로 동작한다. 이를 기반으로 GC 진행된다.
※ java는 JVM 위에서 Java의 멀티스레딩 모델을 그대로 사용하기에 진짜 병렬로 실행된다.
count = 0
def increment():
global count
for _ in range(1000000):
count += 1
위 연산 count += 1은 실제로는 다음 세 단계를 거친다.
- count 값을 읽고
- 1을 더한 값을 계산하고
- 그 결과를 다시 count에 저장함
두 스레드가 같은 값을 읽고, 각자 1을 더한 다음, 둘 다 같은 시점에 덮어쓰는 일이 생길 수 있다.
이러한 구성(CPython의 GIL 구조)으로 인해 동시성은 보장되지만, 완벽한 병렬 처리는 멀티스레드로는 기대하기 어렵다.
진정한 병렬 처리를 원한다면, 멀티프로세스를 사용하는 것이 적합하다.
---
ASGI(Asynchronous Server Gateway Interface)
비동기 Python 웹 프레임워크를 위한 표준 인터페이스이다.
CGI (Common Gateway Interface) -> WSGI (Web Server Gateway Interface) -> ASGI
위 순서로 발전해온 상태라고 보면 된다.
간단히 설명하면
CGI는 원시적인 웹 인터페이스이고, 웹 요청마다 프로세스를 생성한다. 이는 느리고 리소스를 많이 쓰기에 사용하지 않는다.
WSGI는 표준 동기 웹 인터페이스이다. 멀티스레딩을 통해 하나의 프로세스로 여러 요청 처리가 가능하다. 비동기, websocket은 지원하지 않는다.
ASGI
WSGI의 비동기 확장 버전이다.
http + websocket + 백그라운드 작업 모드 처리가능하다.
요즘 Python 웹 프레임워크의 기반이되었다.
---
Uvicorn
ASGI 서버 중 하나로, 비동기 Python 웹 프레임워크(FastAPI, Starlette 등)를 빠르고 효율적으로 실행해주는 경량 고성능 웹 서버이다.
클라이언트가 보낸 HTTP 요청은 먼저 Uvicorn으로 전달
Uvicorn은 이 요청을 ASGI 프로토콜에 맞는 형식으로 변환
요청을 FastAPI 애플리케이션 인스턴스에 전달
Uvicorn 단독 실행
uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
- ASGI 서버인 Uvicorn만으로 FastAPI 실행
- --workers 옵션을 사용해 멀티 프로세스 실행 가능
- 간단한 개발/운영 환경에 적합
- 단점: 프로세스 관리, 장애 복구 기능이 상대적으로 부족
Gunicorn + UvicornWorker 조합
gunicorn main:app \
--workers 4 \
--worker-class uvicorn.workers.UvicornWorker \
--bind 0.0.0.0:80
- Gunicorn은 멀티 프로세스 관리에 특화된 WSGI 서버
- FastAPI는 ASGI이므로 직접 사용 불가
- → 대신 uvicorn.workers.UvicornWorker를 worker class로 지정하여 우회 사용
- 이 방식은 Gunicorn이 프로세스를 관리하고
각 프로세스에서 Uvicorn이 FastAPI를 실행함 - 장점: 프로세스 충돌 시 자동 복구, 운영 안정성 뛰어남
'Python' 카테고리의 다른 글
MCP 사용해보기 (/w cursor, unity) (0) | 2025.04.06 |
---|---|
args ??? kwargs ??? (0) | 2024.07.30 |
lambda ??? (0) | 2024.07.29 |
Slack API (fastapi - slack_bolt) (0) | 2024.07.19 |
azure openAI (GPT4.0, ada-002) (0) | 2023.11.26 |