-
ASGI(Asyncronous Server Gateway Interface)란?파이썬/Etc. 2021. 5. 8. 15:43
WSGI가 나오게 된 동기
파이썬은 현재 다양한 웹 애플리케이션(django, flask, fast api 등)을 자랑한다. 그러나, 이러한 폭 넓은 선택들은 새로운 파이썬 사용자에게 문제가 될 수 있다. 일반적으로 웹 프레임워크를 선택하면 사용가능한 웹 서버의 선택이 제한되고 그 반대도 마찬가지이기 때문이다. 따라서 WSGI는 웹 서버와 웹 프레임워크간의 구현에 구애받지 않는 인터페이스로 만들어져 이식가능한 웹 애플리케이션 개발을 할 수 있다.
WSGI의 한계
- 웹소켓을 사용할 수 없다. wsgi.websocket을 사용할 수 있으나 표준화되지 않았다.
- HTTP/2(Concurrency) 동시성을 적용할 수 없다.
- Can't use async and await: 파이썬의 비동기를 사용할 수 없다.
비동기 웹이 나오게 된 동기
위의 WSGI의 한계점들을 개선하고자 async web이 등장하게 되었다.
from aiohttp import web # Can use async and await async def hello(request): await db.execute('SELECT * FROM table') return web.Response(text='Hello, world') app = web.Application() app.add_routes([web.get('/', hello)]) web.run_app(app)
파이썬은 현재 다양한 비동기 웹 애플리케이션(aiohttp, sanic 등)을 자랑한다. 그러나, 이러한 폭 넓은 선택들은 새로운 파이썬 사용자에게 문제가 될 수 있다. 일반적으로 웹 프레임워크를 선택하면 사용가능한 웹 서버의 선택이 제한되고 그 반대도 마찬가지이기 때문이다. 따라서 ASGI는 웹 서버와 웹 프레임워크간의 구현에 구애받지 않는 인터페이스로 만들어져 이식가능한 웹 애플리케이션 개발을 할 수 있다.
ASGI의 작동
ASGI는 단일 비동기 호출이 가능한 구조로 되어 있다.
- scope: 연결에 대한 세부사항을 가지고 있는 딕셔너리 형태
- send: send를 비동기적으로 호출하여 애플리케이션이 클라이언트로 비동기 이벤트 메세지 보낼수 있음
- receive: receive를 비동기적으로 호출하여 애플리케이션이 클라이언트로부터 비동기 이벤트 메세지를 받을 수 있음
예제
모든 이벤트에는 이벤트의 구조를 나타내는 type 키를 정의한다.
# receive # HTTP 요청이 body키에 들어있다. { "type": "http.request", "body": b"Hello World", "more_body": False, } # send # 웹소켓을 통해 Hello, world라는 텍스트를 보낸다. { "type": "websocket.send", "text": "Hello world!", }
WSGI와의 호환
구조적으로 ASGI는 WSGI의 슈퍼셋으로 설계되었다. 그러므로 wsgi의 동기적인 요청을 asgiref 라이브러리를 통해 응답을 할 수 있다.
'파이썬 > Etc.' 카테고리의 다른 글
파이썬 알파인 이미지란 무엇일까? (0) 2021.01.08 Pipenv란?? (0) 2020.10.22 Python data built-in classes (0) 2020.09.27