Python용 상위 5가지 비동기 웹 프레임워크

비동기 프로그래밍은 이제 Python의 일류 시민입니다. 웹 개발자라면 선택할 수 있는 놀라운 프레임워크가 있습니다!

글을 쓰는 시점에서 비동기는 더 이상 Python 커뮤니티에서 유행어가 아닙니다. 출시와 함께 비동기 3.5 버전의 라이브러리에서 Python은 Node.js가 웹 개발에 미치는 영향을 인정하고 언어에 async 및 await의 두 가지 새로운 키워드를 도입했습니다. Python 개발자가 비동기 기능을 기본적으로 얼마나 중요하게 생각했는지 나타내는 긴급한 필요가 없는 한 Python 언어는 핵심 구문을 확장하는 것을 극도로 경계하기 때문에 이는 매우 큰 문제였습니다.

결과적으로 비동기 프로그래밍의 수문이 열렸습니다. 새롭고 오래된 라이브러리가 코루틴 기능을 사용하기 시작했고 비동기 프레임워크의 인기가 폭발적으로 증가했으며 오늘날에도 새로운 라이브러리가 작성되고 있습니다. Node.js와 동등하거나 더 나은 성능은 전례가 없으며, 로드 패턴에 CPU를 많이 사용하는 작업이 많이 포함되지 않는 한 초당 수천 개의 요청을 수행하지 못할 이유가 없습니다.

하지만 충분한 동기부여!

현재 Python 환경을 조사하고 최고의 비동기 프레임워크 중 일부를 확인해 보겠습니다.

폭풍

놀랍게도, 폭풍 전혀 새로운 프레임워크가 아닙니다. 최초 릴리스는 2009년(정확히 10년 전, 작성 시점)이었고 그 이후로 높은 동시성을 가진 견고한 비동기 프로그래밍을 제공하는 데 중점을 두었습니다.

토네이도는 근본적으로 웹 프레임워크가 아닙니다. 웹 프레임워크 모듈을 빌드하는 데에도 사용되는 비동기 모듈의 모음입니다. 보다 구체적으로 이러한 모듈은 다음과 같습니다.

  • 코루틴 및 기타 기본 요소(tornado.gen, tornado.locks, tornado.queues 등)
  • 네트워킹 모듈(tornado.ioloop, tornado.iostream 등)
  • 비동기식 서버 및 클라이언트(tornado.httpserver, tornado.httpclient 등)

이것들은 결합되어 최종 프레임워크 모듈인 tornado.web, tornado.routing, tornado.template 등을 생성합니다.

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

Tornado는 Python 커뮤니티에서 강력하고 헌신적인 추종자를 보유하고 있으며 숙련된 설계자가 고성능 시스템을 구축하는 데 사용합니다. 그것은 동시성의 문제에 대한 해답을 오랫동안 가지고 있었지만 아마도 WSGI 표준을 지원하지 않고 너무 많이 구매했기 때문에 주류가 되지 못한 프레임워크입니다(대부분의 Python 라이브러리는 여전히 동기식임을 기억하십시오. ).

  현재 NVIDIA GPU 데스크탑에 연결된 디스플레이를 사용하지 않는 문제 수정

사닉

사닉 진정한 의미의 “현대적인” 프레임워크입니다. Python 3.6 미만 버전을 지원하지 않고 기본적으로 간단하고 보편적인 async/await 구문을 지원하므로 결과적으로 로드를 읽지 않습니다. 첫 번째 HTTP 핸들러를 작성하기 전에 문서화를 하고 엣지 케이스를 염두에 두십시오.

결과적으로 결과 구문은 매우 쾌적합니다(최소한 제 생각에는). 다음과 같이 몇 가지 비동기를 뿌린 다른 마이크로프레임워크(예: Flask, CherryPy)로 작성하는 코드와 유사합니다.

from sanic import Sanic
from sanic.response import json

app = Sanic()

@app.route("/")
async def test(request):
    return json({"hello": "world"})

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000)

Sanic은 틀림없이 Python 세계에서 가장 인기 있고 가장 사랑받는 비동기 프레임워크입니다. 라우팅, 미들웨어, 쿠키, 버전 관리, 청사진, 클래스 기반 보기, 정적 파일, 스트리밍, 소켓 등 프로젝트에 필요한 거의 모든 기능과 기본 제공되지 않는 기능이 있습니다. — 템플릿, 데이터베이스 지원, 파일 I/O, 대기열 — 현재로서는 이들을 위한 비동기 라이브러리가 충분하기 때문에 추가할 수 있습니다.

비보라

비보라 가장 빠른 Python 웹 서버가 되는 데 집착한다는 점을 제외하면 Sanic의 가까운 사촌입니다. 실제로 웹 사이트를 처음 방문하면 프레임워크 비교가 나타납니다.

보시다시피 Vibora는 클래식 프레임워크보다 몇 배 빠르며 가장 가까운 경쟁자인 Sanic보다 두 배 이상 빠르다고 주장합니다. 물론 벤치마크는 한 알의 소금으로 취해야 합니다. 🙂

구문과 기능 면에서 Vibora는 Sanic과 비슷하지만(또는 인기 있는 라이브러리를 번들로 제공하고 템플릿과 같은 것을 즉시 사용할 수 있기 때문에 약간 더 나을 수도 있음) Sanic이 더 오래 사용되었고 더 큰 커뮤니티.

from vibora import Vibora, JsonResponse

app = Vibora()

@app.route('/')
async def home():
    return JsonResponse({'hello': 'world'})

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8000)

당신이 성능 중독자라면 Vibora가 당신의 보트를 띄울 수 있습니다. 즉, 작성 시점에서 Vibora는 더 빨라지기 위해 완전히 다시 작성 중이며, 링크 성능 버전에는 “무거운 개발” 중이라고 나와 있습니다. 더 일찍 Vibora를 선택한 사람들에게는 실망이 될 것이며 곧 주요 변경 사항에 직면해야 하지만 이봐, Python 비동기 세계의 초기이고 아무도 상황이 안정적일 것이라고 기대하지 않습니다.

  Mac Pro는 PC에 비해 비싸다?

쿼트

Flask에서 개발하는 것을 좋아하지만 비동기 지원이 부족하면 쿼트 많이.

쿼트는 다음을 준수합니다. ASGI 유명한 WSGI 표준의 후속 제품이며 비동기 지원을 제공하는 표준입니다. Quart의 흥미로운 점은 Flask와 유사할 뿐만 아니라 실제로 Flask API와 호환된다는 것입니다! 이 프레임워크의 작성자는 Flask 느낌을 유지하고 비동기, WebSocket 및 HTTP 2 지원을 추가하기를 원했습니다. 결과적으로 Quart의 함수는 비동기식이라는 점을 염두에 두고 Flask 문서에서 Quart를 바로 배울 수 있습니다.

from quart import Quart

app = Quart(__name__)

@app.route('/')
async def hello():
    return 'hello'

app.run()

(거의) 플라스크와 같은 느낌이 들죠?

Quart는 Flask의 진화판이므로 Flask 내부의 모든 기능(라우팅, 미들웨어, 세션, 템플릿, 청사진 등)을 사용할 수 있습니다. 실제로 Quart 내에서 직접 Flask 확장을 사용할 수도 있습니다. 한 가지 주의할 점은 Python 3.7 이상만 지원되지만 최신 버전의 Python을 실행하지 않는 경우 비동기가 올바른 경로가 아닐 수 있다는 것입니다. 🙂

Flask에 대한 이전 경험이 없다면 문서가 정말 필요하지만 Quart는 곧 1.0 릴리스에 가까운 유일한 비동기 프레임워크일 것이기 때문에 추천할 수 있습니다.

빠른 API

이 목록의 마지막(그러나 가장 인상적인) 프레임워크는 빠른 API. 아니요, API 전용 프레임워크가 아닙니다. 사실 FastAPI는 비동기 Python 프레임워크를 조사할 때 만난 가장 기능이 풍부하고 문서가 풍부한 프레임워크인 것 같습니다.

프레임워크 작성자가 Django와 같은 최신 프레임워크에서 Sanic과 같은 최신 프레임워크에 이르기까지 여러 다른 프레임워크를 심층적으로 연구했으며 NestJS(Node.js, Typescript 웹 프레임워크)에 대한 여러 기술을 살펴봤다는 점은 흥미롭습니다. 그들의 개발 철학과 광범위한 비교를 읽을 수 있습니다. 여기.

구문은 매우 쾌적합니다. 우리가 만난 다른 프레임워크보다 훨씬 더 즐겁다고 주장할 수도 있습니다.

rom fastapi import FastAPI

app = FastAPI()

@app.get("/users/me")
async def read_user_me():
    return {"user_id": "the current user"}

@app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"user_id": user_id}

이제 FastAPI를 다른 프레임워크보다 돋보이게 만드는 주요 기능 목록은 다음과 같습니다.

  HomePod mini에 관심이 있으세요? 알아야 할 사항은 다음과 같습니다.

자동 API 문서 생성: 엔드포인트가 작성되는 즉시 표준 호환 UI를 사용하여 API를 사용할 수 있습니다. SwaggerUI, ReDoc 등이 지원됩니다.

프레임워크는 JSON 스키마를 사용하여 자동 데이터 모델 문서화도 수행합니다.

현대적 개발: 예, “현대적”이라는 단어가 많이 돌아다니지만 저는 FastAPI가 실제로 그 이야기를 하는 것을 발견했습니다. 의존성 주입과 타입 힌트는 좋은 코딩 원칙을 적용할 뿐만 아니라 장기적으로 버그와 혼란을 방지하는 일류 시민입니다.

광범위한 문서: 나는 당신에 대해 모르지만 나는 좋은 문서에 완전히 빠져 있습니다. 그리고 이 분야에서 FastAPI가 승승장구합니다. 거의 모든 작은 미묘함을 설명하고 “조심하세요!”라고 설명하는 페이지마다 문서가 있습니다. 모든 수준의 개발자를 위한 순간. 여기 문서에서 명확한 “마음과 영혼”이 느껴지며 내가 찾을 수 있는 유일한 비교는 Django 문서입니다(예, FastAPI 문서가 좋습니다!).

기본 이상: FastAPI는 CORS, 세션, 쿠키 등과 같은 모든 기존 도우미가 있는 것 외에도 WebSocket, 스트리밍 및 GraphQL을 지원합니다.

그리고 성능은 어떻습니까? 음, FastAPI는 놀라운 Starlette 라이브러리를 기반으로 하므로 Node 및 경우에 따라 Go!와 일치하는 성능을 제공합니다. 전반적으로 FastAPI가 Python을 위한 최고의 비동기 프레임워크로 앞서 나갈 것이라는 느낌이 듭니다.

결론

요즘 Python 비동기 환경에서 많은 일이 진행되고 있습니다. 새로운 프레임워크가 등장하고, 기존 프레임워크가 다시 작성되고, 라이브러리가 비동기 동작과 일치하도록 진화하고 있습니다. Python에는 이벤트 루프에 대한 지원이 내장되어 있고 애플리케이션의 일부를 비동기식으로 만드는 것이 가능하지만, 여기에 있는 프레임워크 중 하나를 기반으로 모든 기능을 제공하도록 선택할 수 있습니다. 장기적으로 염두에 두십시오. Python 비동기 프레임워크 중 일부는 초기 단계에 있으며 빠르게 발전하고 있으므로 개발 프로세스에 피해를 주고 비즈니스 비용을 높일 수 있습니다. 주의가 핵심입니다!

그러나 모두 말하고 행했습니다. Python은 웹 프레임워크와 관련하여 뛰어난 성능을 제공할 수 있는 프로덕션 준비가 되어 있습니다. 오랫동안 Node로 마이그레이션할 생각을 했다면 이제 그럴 필요가 없습니다! 🙂

멋진데? 오늘의 파이썬 마스터!