00 서론
- ASGI는 WSGI의 후계자이며, WSGI를 이해하기 위해선 사전에 CGI에 대한 이해가 있으면 도움이 됨
1. CGI란
- 'Common Gateway Interface'의 약자
- 클라이언트와 Web 서버 사이의 커뮤니케이션 메소드를 정의하는 인터페이스 (프로그램이라고도 할 수 있음)
- 작동 예:
- 일반적인 경우 클라이언트가 요청을 보내고 Web 서버가 해당 요청의 내용을 HTTP 프로토콜에 따라 파싱한 후, 반환된 내용을 캡슐화함
- 서버가 HTML 페이지를 반환하고 HTTP 프로토콜에 따라 반환된 내용의 응답 형식을 구성함
- TCP 연결, 원래의 HTTP 요청 및 해당 형식 모두 CGI 프로그램에 의해 완료됨
2. WSGI란
- 'Web Server Gateway Interface'의 약자
- Python Web 서버와 Web 앱 또는 프레임워크 간의 간단하고 보편적인 인터페이스 (또는 프로그램)
1) WSGI의 문제
- WSGI를 업그레이드하지 않고 ASGI를 따로 만든 이유:
- WSGI의 단일 호출 인터페이스가 WebSocket과 같은 더 복잡한 Web protocol에 적합하지 않기 때문
- WSGI 앱은 동기 및 단일 호출 방식 (single, synchronous callable), 즉 요청을 받고 응답을 반환하는 방식으로 작동
- 이런 방식은 long-poll HTTP나 WebSocket 연결과 같은 장기 연결(long-lived connection)을 불가능하게 함
- WSGI 호출 방식을 비동기로 만들더라도, WSGI는 요청을 제공할 때 사용되는 경로가 단일, 하나로 되어있기에 다수 입력 이벤트 (e.g., WebSocket 프레임들 수신)를 가진 protocol들은 이것을 트리거 할 수 없음
- 그러므로 ASGI라는 인터페이스 프로그램을 생성함
01 ASGI란
- 'Asynchronous Server Gateway Interface' 의 약자
- ASGI는 WSGI의 후계자로 웹 서버 (async-capable Python 웹 서버), 프레임워크, 그리고 앱 (응용 프로그램) 간의 호환성을 위한 표준 인터페이스 제공하는 프로그램
- WSGI는 Python 웹 공간에서 동기 Python 앱을 위한 표준을 제공했다면, ASGI는 동기 및 비동기 앱 둘 다를 위한 표준 제공
- 동기 vs 비동기 방식 (Synchronouns vs Asynchronous)
- 동기 Sync
- multi-thread, which means operations or programs can run in parallel
- Async is non-blocking, which means it will send multiple requests to a server
- 작업 실행 시 그 작업이 완료되지 않더라도 다음 코드를 실행하는 방식
- 비동기 Async
- single-thread, so only one operation or program will run at a time
- 작업 실행 시 그 작업이 끝나기를 기다리는 방식 - 작업이 완료될 때까지 다음 코드의 실행을 멈추고 기다림
- 구체적인 예시:
- DB나 API 연동 과정에서 발생하는 대기 시간을 낭비하지 않고, CPU가 다른 작업을 할 수 있도록 하는 방식
- 동기 Sync
- 동기 vs 비동기 방식 (Synchronouns vs Asynchronous)
- ASGI는 WSGI의 원래 모드와 WebSocket의 확장 지원 (즉, ASGI는 WSGI의 확장)
1. 작동 방식
- ASGI는 단일 비동기 호출로 구성됨
- 3가지를 받음:
- scope: 특정한 연결에 관한 세부정보(details)를 포함한 dict
- send: 앱이 클라이언트에게 이벤트 메세지를 보내게 하는 비동기 호출
- receive: 앱이 클라이언트로부터 이벤트 메세지를 받을 수 있게 하는 비동기 호출
- 이는 각 앱이 여러 입출력 이벤트 (incoming and outgoing events)를 허용하며 앱이 백그라운드 coroutine을 사용하여 앱이 다른 작업들을 수행하는 것을 가능케 함 (예: Redis queue와 같이 외부 트리거에서 이벤트를 수신하는 것 등)
2. 적용되는 서버, 프레임워크, 다른 도구들
1) 서버
- Daphne, Granian, Hypercorn, NGNIX Unit, Uvicorn
Daphne
- https://github.com/django/daphne
- the current ASGI reference server, writtne in Twisted and maintained as part of the Django Channels project
- supports HTTP/1, HTTP/2, WebSockets
Granian
- https://github.com/emmett-framework/granian
- a Rust HTTP server for Python applications
- supports ASGI/3, RSGI, WSGI interface applications
Hypercorn
- https://pgjones.gitlab.io/hypercorn/index.html
- an ASGI server based on the sans-io hyper, h11, h2, ans wsproto libraries
- supports HTTP/1, HTTP/2, WebSockets
NGINX Unit
- https://unit.nginx.org/configuration/#configuration-python
- unit is a lightweight and versatile open-source server that has three core capabilities: it is a web server for static media assets, an application server that runs code in multiple languages, and a reverse proxy
Uvicorn
- https://www.uvicorn.org/
- a fast ASGI server based on uvloop and httptools
- supports HTTP/1 and WebSockets
2) 앱 프레임워크
- BlackSheep, Connexion, Django/Channels, Esmerald, FastAPI, Litestar, Quart, Sanic, rpc.py. Starlette
BlackSheep
- https://github.com/Neoteroi/BlackSheep
- typed, fast, minimal web framework
- has a performant HTTP client, flexible dependency injection model, OpenID Connect integration, automatic OpenAPI documentation, dedicated test client and excellent authentication and authorization policy implementation
- supports HTTP and WebSockets
Connexion
Django/Channels
- http://channels.readthedocs.io
- Channels is the Django project to add asynchronous support to Django and is the original driving force behind the ASGI project
- supports HTTP and WebSockets with Django integration, and any protocol with ASGI-natie code
Esmerald
FastAPI
- https://github.com/tiangolo/fastapi
- an ASGI web framework (made with Starlette) for building web APIs based on standard Python type annotations and standards like OpenAPI, JSON Schema, and OAuth2
- supports HTTP and WebSockets
Litestar
Quart
Sanic
rpc.py
Starlette
- https://github.com/encode/starlette
- a minimalist ASGI library for writing against basic but powerful Request and Response classes
- supports HTTP and WebSockets
3) 도구
a2wsgi
- https://github.com/abersheeran/a2wsgi
- convert WSGI application to ASGI application or vice versa
- pure Python
- only depend on the standard library
참조
'Python' 카테고리의 다른 글
faulthandler (파이썬 추적 백업 모듈) (0) | 2024.07.05 |
---|---|
@classmethod, @staticmethod (파이썬 매서드 데코레이터) (1) | 2024.07.01 |
클래스, 객체, 속성, 메서드, 생성자, 인스턴스란 (파이썬 용어) (0) | 2024.06.29 |
abc (추상화 클래스) (0) | 2024.06.28 |
distutils (파이썬 모듈 배포 패키지) (0) | 2024.06.18 |