5 khung web không đồng bộ tốt nhất cho python

Lập trình không đồng bộ hiện là công dân hạng nhất trong Python. Nếu bạn là nhà phát triển web, bạn có thể chọn từ các khung tuyệt vời!

Tại thời điểm viết bài này, async không còn chỉ là một từ thông dụng trong cộng đồng Python. Với việc phát hành phiên bản asyncio của nó 3.5 Python đã nhận ra tác động của Node.js đối với việc phát triển web và giới thiệu hai từ khóa mới cho ngôn ngữ này – không đồng bộ và chờ đợi. Đây là một điểm rất quan trọng vì Python rất cẩn thận trong việc mở rộng cú pháp cơ bản trừ khi có nhu cầu cấp bách, điều này cho thấy tầm quan trọng cơ bản của các khả năng không đồng bộ của Python đối với các lập trình viên Python.

Kết quả là, các cổng lập trình không đồng bộ đã được mở ra: các thư viện mới và cũ đã tận dụng các chức năng của coroutine, các khung không đồng bộ đã trở nên phổ biến và các khung mới vẫn đang được tạo. Hiệu suất có thể so sánh hoặc tốt hơn Node.js không phải là chưa từng có và trừ khi các mẫu tải của bạn bao gồm nhiều tác vụ sử dụng nhiều CPU, không có lý do gì bạn không thể thực hiện vài nghìn yêu cầu mỗi giây.

Nhưng đủ động lực!

Chúng ta hãy xem bối cảnh Python hiện tại và kiểm tra một số khung không đồng bộ tốt nhất.

Lốc xoáy

Đáng ngạc nhiên, Tornado hoàn toàn không phải là một framework mới. Bản phát hành đầu tiên của nó là vào năm 2009 (chính xác là mười năm trước tại thời điểm viết bài này) và kể từ đó, nó đã tập trung vào việc cung cấp chương trình không đồng bộ mạnh mẽ với tính đồng thời cao.

Tornado về cơ bản không phải là một khung web. Nó là tập hợp các mô-đun không đồng bộ cũng được sử dụng để xây dựng mô-đun web của khung. Cụ thể hơn, các mô-đun này là:

  • Coroutines và các nguyên thủy khác (tornado.gen, Tornado.locks, Tornado.queues, v.v.)
  • Các mô-đun mạng (tornado.ioloop, Tornado.iostream, v.v.)
  • Máy chủ và máy khách không đồng bộ (tornado.httpserver, Tornado.httpclient, v.v.)

Chúng được kết hợp để tạo ra các mô-đun cuối cùng của khung: Tornado.web, Tornado.routing, Tornado.Template, v.v.

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 có một cộng đồng mạnh mẽ và tận tâm trong cộng đồng Python và được các kiến ​​trúc sư giàu kinh nghiệm sử dụng để xây dựng các hệ thống hiệu quả cao. Đó là một khung từ lâu đã có giải pháp cho các vấn đề tương tranh, nhưng có lẽ nó không trở thành xu hướng chủ đạo vì nó không hỗ trợ tiêu chuẩn WSGI và có quá nhiều nhu cầu (lưu ý rằng hầu hết các thư viện python vẫn đồng bộ).

Sanic

Sanic là một khung “hiện đại” theo đúng nghĩa: nó không hỗ trợ các phiên bản python bên dưới 3.6hỗ trợ cú pháp async/await đơn giản và linh hoạt ngay lập tức, vì vậy bạn không cần phải đọc vô số tài liệu và nhận biết các trường hợp cạnh trước khi có thể viết trình xử lý HTTP đầu tiên của mình.

Kết quả là, cú pháp kết quả khá đẹp (ít nhất là theo ý kiến ​​của tôi); giống với mã bạn sẽ viết với bất kỳ vi khung nào khác (ví dụ: Flask, CherryPy) với một số bổ sung không đồng bộ:

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 có lẽ là framework bất đồng bộ phổ biến và được yêu thích nhất trong thế giới Python. Nó có hầu hết tất cả các tính năng bạn cần cho dự án của mình – định tuyến, phần mềm trung gian, cookie, tạo phiên bản, bản thiết kế, chế độ xem dựa trên lớp, tệp tĩnh, phát trực tuyến, ổ cắm, v.v. – và những gì nó không cung cấp ngay lập tức – mẫu , hỗ trợ cơ sở dữ liệu, tệp I/O, hàng đợi – có thể được thêm vào vì ngày nay có đủ thư viện không đồng bộ.

Wibor

Wibora là anh em họ gần của Sanic, ngoại trừ việc nó tập trung vào việc trở thành máy chủ web Python nhanh nhất. Trên thực tế, lần đầu tiên bạn truy cập trang web của anh ấy, bạn sẽ được chào đón bằng một khung so sánh:

Như bạn có thể thấy, Vibora tuyên bố là nhanh hơn nhiều lần so với các khung cổ điển và nhanh hơn gấp đôi so với đối thủ cạnh tranh gần nhất của nó, Sanic. Tất nhiên, điểm chuẩn nên được thực hiện với một hạt muối.

Mặc dù về cú pháp và tính năng, Vibora có thể so sánh với Sanic (và thậm chí có thể tốt hơn một chút, vì nó bao gồm các thư viện phổ biến và những thứ như mẫu có sẵn), tôi tin rằng Sanic trưởng thành hơn vì nó đã tồn tại lâu hơn và có cộng đồng lớn hơn.

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)

Tuy nhiên, nếu bạn nghiện hiệu suất, Vibora có thể làm nổi con thuyền của bạn. Điều đó nói rằng, khi viết Vibora đang trong quá trình viết lại hoàn chỉnh để trở nên nhanh hơn nữa và liên kết đến phiên bản hiệu suất cho biết nó đang trong “sự phát triển nặng nề”. Đây sẽ là một sự thất vọng đối với những người trước đây đã chọn Vibora và sẽ sớm phải đối phó với những thay đổi đột phá, nhưng này, đây mới chỉ là khởi đầu của thế giới Python không đồng bộ và không ai mong đợi mọi thứ sẽ ổn định.

quart

Nếu bạn thích lập trình trong Flask nhưng tiếc vì thiếu hỗ trợ không đồng bộ, thì bạn sẽ thích Quart rất nhiều.

Quart tuân thủ tiêu chuẩn ASGI, là tiêu chuẩn kế thừa của tiêu chuẩn WSGI nổi tiếng và cung cấp hỗ trợ không đồng bộ. Điều thú vị về Quart là nó không chỉ giống với Flask mà còn thực sự tương thích với Flask API! Tác giả của khung này muốn giữ cảm giác của Flask và chỉ thêm hỗ trợ async, WebSockets và HTTP vào nó 2. Do đó, bạn có thể tìm hiểu Quart trực tiếp từ tài liệu Flask, chỉ cần nhớ rằng các hàm Quart là không đồng bộ.

from quart import Quart

app = Quart(__name__)

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

app.run()

Cảm thấy (gần như) chính xác như Flask, phải không?!

Vì Quart là một sự phát triển của Flask nên tất cả các tính năng của Flask đều khả dụng: định tuyến, phần mềm trung gian, phiên, mẫu, kế hoạch, v.v. Trên thực tế, bạn thậm chí có thể sử dụng tiện ích mở rộng Flask trực tiếp trong Quart. Một nhược điểm là chỉ Python được hỗ trợ 3.7+, nhưng nếu bạn không sử dụng phiên bản mới nhất của python, có lẽ async không phải là con đường phù hợp.

Tài liệu là rất cần thiết nếu bạn không có kinh nghiệm trước với Flask, nhưng tôi có thể giới thiệu Quart vì nó có thể là khung không đồng bộ duy nhất sẽ sớm được phát hành 1.0.

API nhanh

Khung cuối cùng (nhưng ấn tượng nhất) trong danh sách này là FastAPI. Không, đó không phải là khung chỉ dành cho API; trên thực tế, FastAPI dường như là khung giàu tài liệu và tính năng nhất mà tôi đã gặp khi nghiên cứu các khung Python không đồng bộ.

Điều đáng chú ý là tác giả của khung này đã nghiên cứu sâu về một số khung khác, từ những khung hiện đại như Django đến những khung hiện đại như Sanic, đồng thời cũng xem xét các công nghệ khác trong NestJS (khung web Node.js, Bản mô tả). Triết lý phát triển của họ và so sánh rộng rãi có thể được đọc ở đây.

Cú pháp khá hay; bạn thậm chí có thể lập luận rằng nó đẹp hơn nhiều so với các khung khác mà chúng tôi đã gặp:

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}

Và bây giờ là danh sách các tính năng tuyệt vời giúp FastAPI vượt trội so với các khung khác:

Tự động tạo tài liệu API: Ngay sau khi điểm cuối của bạn được viết, bạn có thể chơi với API bằng giao diện người dùng tuân thủ tiêu chuẩn. SwaggerUI, ReDoc và những thứ khác được hỗ trợ.

Khung cũng thực hiện tài liệu tự động của mô hình dữ liệu bằng lược đồ JSON.

Sự phát triển hiện đại: Vâng, từ “hiện đại” được sử dụng rất nhiều, nhưng tôi đã tìm thấy FastAPI để hiểu đúng. Nội dung phụ thuộc và gợi ý loại là công dân hạng nhất, không chỉ thực thi các quy tắc mã hóa tốt mà còn ngăn ngừa lỗi và nhầm lẫn trong thời gian dài.

Tài liệu mở rộng: Tôi không biết về bạn, nhưng tôi hoàn toàn là một người mê tài liệu hay. Và trong lĩnh vực này, FastAPI dễ dàng chiến thắng. Nó có các trang tài liệu giải thích hầu hết mọi chi tiết nhỏ và “hãy coi chừng!” khoảnh khắc cho các nhà phát triển của tất cả các cấp. Tôi cảm nhận được “trái tim và linh hồn” rõ ràng trong tài liệu ở đây và so sánh duy nhất tôi có thể tìm thấy là với tài liệu Django (vâng, tài liệu FastAPI rất tốt!).

Ngoài những điều cơ bản: FastAPI hỗ trợ WebSockets, Truyền phát cũng như GraphQL ngoài việc có tất cả các trình trợ giúp truyền thống như CORS, Phiên, Cookie, v.v.

Còn hiệu suất thì sao? Chà, FastAPI được xây dựng dựa trên thư viện Starlette tuyệt vời, mang lại cho bạn hiệu suất sánh ngang với Node và trong một số trường hợp thậm chí là Go! Nói chung, tôi thực sự có cảm giác rằng FastAPI sẽ chạy đua với tư cách là khung không đồng bộ tốt nhất cho Python.

Đăng kí

Có rất nhiều thứ đang diễn ra trong bối cảnh không đồng bộ của Python ngay bây giờ. Các framework mới xuất hiện, các framework cũ được viết lại và các thư viện phát triển để phù hợp với hành vi không đồng bộ. Mặc dù Python có hỗ trợ tích hợp cho các vòng lặp sự kiện và có thể xây dựng các phần của ứng dụng của bạn một cách không đồng bộ, nhưng bạn có thể chọn “bất kỳ thứ gì” và xây dựng trên một trong các nền tảng tại đây. Chỉ cần nhớ ghi nhớ về lâu dài: một số khung không đồng bộ python đang ở giai đoạn đầu và đang được phát triển nhanh chóng, điều này sẽ ảnh hưởng đến quá trình phát triển của bạn và tăng chi phí kinh doanh của bạn. Thận trọng là chìa khóa!

Nhưng tất cả được nói và làm; Python đã được sản xuất sẵn sàng để thực hiện khi nói đến các khung web. Nếu bạn đã suy nghĩ về việc chuyển sang Node trong một thời gian dài, thì bây giờ bạn không cần phải làm vậy nữa!

Âm thanh tốt đẹp? Làm chủ Python ngay hôm nay!

Những bài viết liên quan

Back to top button