ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글