Uvicorn이란?

최근까지 Python에는 asyncio 프레임 워크를위한 저수준 서버 / 애플리케이션 인터페이스가 없었습니다.

이런 상황에서 Uvicorn이 등장했습니다. Uvicorn이란 uvloophttptools를 사용하는 ASGI web server입니다. Uvicorn은 현재 HTTP / 1.1 및 WebSocket을 지원합니다. HTTP / 2에 대한 지원이 계획되어 있습니다.

Uvicorn

ASGI란?

ASGI(Asynchronous Server Gateway Interface)는 비동기 Python 웹 서버입니다.

Asyncio?

Asyncio는 Python 표준 라이브러리와 함께 제공되는 비동기 I/O 프레임 워크입니다. Asyncio는 async / await 구문을 사용하여 비동기(Asynchronous) 코드를 작성하는 라이브러리입니다. Asyncio는 대규모 I / O 처리 및 복잡하게 설계된 서버 구조에 적합합니다. 대표적인 I / O에서의 병목의 예시는, 웹 서버와 같은 애플리케이션에서 찾아볼 수 있습니다. CPU 연산 시간 대비 DB나 API와 연동 과정에서 발생하는 대기 시간이 훨씬 긴 경우가 빈번합니다. 비동기 프로그래밍은 이러한 대기 시간을 낭비하지 않고 그 시간 CPU가 다른 처리를 할 수 있도록 하는데 이를 흔히 non-blocking하다고 합니다. 반대로 동기적 블로킹을 통해 CPU가 다른 업무를 처리 하지 못하면 이를 blocking 되있다고 말합니다.


uvloop

uvloop는 asyncio를 대체하기 위해 만들어졌습니다. Uvloop는 Cython으로 작성되었으며 libuv 위에 구축되었습니다. (여기서libuv는 nodejs에서 사용하는 고성능 다중 플랫폼 비동기 I / O 라이브러리입니다.)

실제 성능상에서 nodejs, gevent 및 기타 Python 비동기 프레임 워크보다 2배 이상 빠릅니다. 성능상으로만 본다면, uvloop 기반 asyncio의 성능은 Go 프로그램의 성능에 가깝습니다.

이렇게 low level 언어로 구현된 것들을 high level 언어인 python 객체를 통해 래핑합니다.

Benchmark

TCP 성능 측정

HTTP 성능 측정

고성능 HTTP 파서의 도움으로 순수 Python asyncio는 동일한 HTTP 파서를 사용하는 nodejs보다 빠릅니다! Benchmark 상에서 Go는 1KiB 응답의 경우 더 빠르지 만 uvloop + asyncio는 10 / 100KiB 응답의 경우 훨씬 더 좋습니다.


참고자료

Uvicorn doc