Κορυφαία 5 ασύγχρονα πλαίσια Ιστού για Python

Ο ασύγχρονος προγραμματισμός είναι πλέον ένας πολίτης πρώτης κατηγορίας στην Python. Εάν είστε προγραμματιστής ιστού, υπάρχουν εκπληκτικά πλαίσια από τα οποία μπορείτε να επιλέξετε!

Από τη στιγμή που γράφτηκε, το asynchronous δεν είναι απλώς ένα τσιτάτο στην κοινότητα Python. Με την κυκλοφορία του asyncio βιβλιοθήκη στην έκδοση 3.5, η Python αναγνώρισε τον αντίκτυπο του Node.js στην ανάπτυξη ιστού και εισήγαγε δύο νέες λέξεις-κλειδιά στη γλώσσα — async και await. Αυτό ήταν πολύ μεγάλο πρόβλημα, επειδή η γλώσσα Python είναι εξαιρετικά επιφυλακτική όσον αφορά την επέκταση της σύνταξης του πυρήνα, εκτός εάν υπάρχει μια πιεστική ανάγκη, η οποία δείχνει μόνο πόσο σημαντικές θεωρούσαν οι προγραμματιστές της Python τις ασύγχρονες δυνατότητες.

Ως αποτέλεσμα, άνοιξαν οι πύλες του ασύγχρονου προγραμματισμού: οι νέες και οι παλιές βιβλιοθήκες άρχισαν να χρησιμοποιούν τη δυνατότητα των κορουτινών, τα ασύγχρονα πλαίσια έγιναν δημοφιλή και νέα γράφονται ακόμα σήμερα. Η απόδοση ισοδύναμη ή καλύτερη από αυτή του Node.js δεν είναι πρωτόγνωρη και, εκτός εάν τα μοτίβα φόρτωσης περιλαμβάνουν πολλές εργασίες βαριές από την CPU, δεν υπάρχει λόγος να μην μπορείτε να κάνετε μερικές χιλιάδες αιτήματα ανά δευτερόλεπτο.

Αρκετό κίνητρο όμως!

Ας εξετάσουμε το τρέχον τοπίο της Python και ας δούμε μερικά από τα κορυφαία ασύγχρονα πλαίσια.

Ανεμοστρόβιλος

Παραδόξως, Ανεμοστρόβιλος δεν είναι καθόλου νέο πλαίσιο. Η αρχική του κυκλοφορία ήταν το 2009 (ακριβώς πριν από δέκα χρόνια, από τότε που γράφτηκε) και από τότε, εστίασε στην παροχή ασύγχρονου προγραμματισμού με υψηλή ταυτόχρονη συγχρονισμό.

Το Tornado δεν είναι ουσιαστικά ένα πλαίσιο Ιστού. Είναι μια συλλογή από ασύγχρονες ενότητες, οι οποίες χρησιμοποιούνται επίσης για τη δημιουργία της ενότητας πλαισίου ιστού. Πιο συγκεκριμένα, οι ενότητες αυτές είναι:

  • Κορουτίνες και άλλα πρωτόγονα (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 και χρησιμοποιείται από έμπειρους αρχιτέκτονες για την κατασκευή συστημάτων υψηλής ικανότητας. Είναι ένα πλαίσιο που εδώ και πολύ καιρό είχε την απάντηση στα προβλήματα του συγχρονισμού, αλλά ίσως δεν έγινε mainstream καθώς δεν υποστηρίζει το πρότυπο WSGI και ήταν υπερβολικά ένα buy-in (θυμηθείτε ότι το μεγαλύτερο μέρος των βιβλιοθηκών Python είναι ακόμα σύγχρονες ).

  Μπορώ να διαγράψω τον λογαριασμό μου στο DoorDash;

Sanic

Sanic είναι ένα «σύγχρονο» πλαίσιο με την πραγματική έννοια της λέξης: δεν υποστηρίζει την έκδοση Python κάτω από την 3.6, υποστηρίζει την απλή και καθολική σύνταξη async/wait out of the box, και ως εκ τούτου, δεν σας κάνει να διαβάζετε φορτία τεκμηρίωσης και κρατήστε τις ακραίες περιπτώσεις στο μυαλό σας προτού μπορέσετε να γράψετε τον πρώτο σας πρόγραμμα χειρισμού 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 είναι αναμφισβήτητα το πιο δημοφιλές και πιο αγαπημένο πλαίσιο async στον κόσμο της Python. Έχει σχεδόν όλα τα χαρακτηριστικά που θα θέλατε για τα έργα σας — δρομολόγηση, ενδιάμεσο λογισμικό, cookies, εκδόσεις, σχεδιαγράμματα, προβολές βάσει κλάσεων, στατικά αρχεία, ροή, υποδοχές κ.λπ. — και τι δεν προσφέρει εκτός συσκευασίας — πρότυπα, υποστήριξη βάσης δεδομένων, I/O αρχείου, ουρές — μπορούν να προστεθούν καθώς υπάρχουν αρκετές ασύγχρονες βιβλιοθήκες για αυτές από σήμερα.

Vibora

Vibora είναι στενός ξάδερφος της Sanic, εκτός από το ότι έχει προσηλωθεί στο να γίνει ο ταχύτερος διακομιστής ιστού Python εκεί έξω. Στην πραγματικότητα, η πρώτη επίσκεψη στον ιστότοπό της σας καλωσορίζει με μια σύγκριση πλαισίου:

Όπως μπορείτε να δείτε, η 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 νωρίτερα και σύντομα θα πρέπει να αντιμετωπίσουν ριζικές αλλαγές, αλλά hey, είναι νωρίς στον ασύγχρονο κόσμο της Python και κανείς δεν περιμένει ότι τα πράγματα θα είναι σταθερά.

  Πώς να αφαιρέσετε τη μέθοδο πληρωμής από το Amazon

Τέταρτο γαλονιού

Εάν απολαμβάνετε την ανάπτυξη στο Flask, αλλά αποδοκιμάζετε την έλλειψη υποστήριξης async, θα απολαύσετε Τέταρτο γαλονιού πολύ.

Το Quart είναι συμβατό με το ΑΣΓΗ standard, το οποίο είναι διάδοχος του διάσημου προτύπου WSGI και προσφέρει υποστήριξη async. Το ενδιαφέρον με το Quart είναι ότι όχι μόνο είναι παρόμοιο με το Flask αλλά είναι στην πραγματικότητα συμβατό με το Flask API! Ο συγγραφέας αυτού του πλαισίου ήθελε να διατηρήσει την αίσθηση του Flask και απλώς να προσθέσει υποστήριξη async, WebSockets και HTTP 2. Ως αποτέλεσμα, μπορείτε να μάθετε το Quart απευθείας από την τεκμηρίωση του Flask, απλά έχοντας κατά νου ότι οι λειτουργίες στο Quart είναι ασύγχρονες.

from quart import Quart

app = Quart(__name__)

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

app.run()

Αισθάνεται (σχεδόν) ακριβώς όπως το Flask, έτσι δεν είναι;!

Δεδομένου ότι το Quart είναι μια εξέλιξη του Flask, όλες οι λειτουργίες του Flask είναι διαθέσιμες: δρομολόγηση, ενδιάμεσο λογισμικό, περίοδοι λειτουργίας, πρότυπα, σχεδιαγράμματα και ούτω καθεξής. Στην πραγματικότητα, μπορείτε ακόμη και να χρησιμοποιήσετε επεκτάσεις Flask απευθείας μέσα στο Quart. Ένα από τα πιάτα είναι ότι η Python 3.7+ υποστηρίζεται μόνο, αλλά, τότε, αν δεν εκτελείτε την πιο πρόσφατη έκδοση της Python, ίσως το async να μην είναι η σωστή διαδρομή. 🙂

Η τεκμηρίωση είναι πολύ ενδιαφέρουσα εάν δεν έχετε προηγούμενη εμπειρία με το Flask, αλλά μπορώ να προτείνω το Quart καθώς είναι ίσως το μόνο πλαίσιο ασυγχρονισμού που πλησιάζει σύντομα την κυκλοφορία του 1.0.

FastAPI

Το τελευταίο (αλλά πιο εντυπωσιακό) πλαίσιο σε αυτή τη λίστα είναι FastAPI. Όχι, δεν είναι ένα πλαίσιο μόνο για API. Στην πραγματικότητα, το FastAPI φαίνεται να είναι το πιο πλούσιο σε χαρακτηριστικά και σε τεκμηρίωση πλαίσιο που συνάντησα όταν ερευνούσα τα ασύγχρονα πλαίσια Python.

Είναι ενδιαφέρον να σημειωθεί ότι ο συγγραφέας του πλαισίου μελέτησε πολλά άλλα πλαίσια σε βάθος, από τα σύγχρονα όπως το Django έως τα σύγχρονα όπως η Sanic, καθώς και να εξετάσει διάφορες τεχνολογίες στο NestJS (ένα Node.js, Typescript web πλαίσιο). Η φιλοσοφία ανάπτυξής τους και οι εκτενείς συγκρίσεις μπορούν να διαβαστούν εδώ.

Η σύνταξη είναι αρκετά ευχάριστη. μπορεί κανείς να υποστηρίξει ότι είναι πολύ πιο ευχάριστο από τα άλλα πλαίσια που έχουμε συναντήσει:

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 να ξεπερνά τα άλλα πλαίσια:

  Πώς να ρυθμίσετε τον έλεγχο ταυτότητας δύο παραγόντων από το iPhone σας

Αυτόματη δημιουργία εγγράφων API: Μόλις γραφτούν τα τελικά σημεία σας, μπορείτε να παίξετε με το API χρησιμοποιώντας μια διεπαφή χρήστη συμβατή με πρότυπα. Υποστηρίζονται τα SwaggerUI, ReDoc και άλλα.

Το πλαίσιο κάνει επίσης αυτόματη τεκμηρίωση μοντέλου δεδομένων με το JSON Schema.

Σύγχρονη ανάπτυξη: Ναι, η λέξη «μοντέρνο» κυκλοφορεί πολύ, αλλά βρήκα το FastAPI να μιλάει. Η Έγχυση εξάρτησης και η υπόδειξη τύπου είναι πολίτες πρώτης κατηγορίας, επιβάλλοντας όχι μόνο καλές αρχές κωδικοποίησης, αλλά αποτρέπουν σφάλματα και σύγχυση μακροπρόθεσμα.

Εκτενής τεκμηρίωση: Δεν ξέρω για εσάς, αλλά είμαι τρελή για καλή τεκμηρίωση. Και σε αυτόν τον τομέα, το FastAPI κερδίζει τα χέρια προς τα κάτω. Έχει σελίδες επί σελίδες εγγράφων που εξηγούν σχεδόν κάθε μικρή λεπτότητα και “προσοχή!” στιγμές για προγραμματιστές όλων των επιπέδων. Αισθάνομαι μια ξεκάθαρη «καρδιά και ψυχή» στα έγγραφα εδώ, και η μόνη σύγκριση που μπορώ να βρω είναι τα έγγραφα του Django (ναι, τα έγγραφα FastAPI είναι τόσο καλά!).

Πέρα από τα βασικά: Το FastAPI έχει υποστήριξη για WebSockets, Streaming, καθώς και GraphQL, εκτός από όλους τους παραδοσιακούς βοηθούς όπως CORS, περιόδους σύνδεσης, cookies και ούτω καθεξής.

Και τι γίνεται με την απόδοση; Λοιπόν, το FastAPI είναι χτισμένο στην εκπληκτική βιβλιοθήκη Starlette, με αποτέλεσμα την απόδοση που ταιριάζει με το Node, και σε ορισμένες περιπτώσεις, ακόμη και με το Go! Συνολικά, έχω πραγματικά την αίσθηση ότι το FastAPI θα προχωρήσει ως το κορυφαίο ασύγχρονο πλαίσιο για την Python.

συμπέρασμα

Πολλά συμβαίνουν στο ασύγχρονο τοπίο της Python αυτές τις μέρες. Νέα πλαίσια εμφανίζονται, τα παλιά ξαναγράφονται και οι βιβλιοθήκες εξελίσσονται για να ταιριάζουν με την ασύγχρονη συμπεριφορά. Ενώ η Python έχει ενσωματωμένη υποστήριξη για έναν βρόχο συμβάντων και είναι δυνατό να κάνετε τμήματα της εφαρμογής σας ασύγχρονα, μπορείτε να επιλέξετε να κάνετε all-in και να βασιστείτε σε ένα από τα πλαίσια εδώ. Απλώς φροντίστε να έχετε κατά νου το μακροπρόθεσμο: πολλά από τα ασύγχρονα πλαίσια Python που κυκλοφορούν βρίσκονται σε πρώιμα στάδια και εξελίσσονται γρήγορα, γεγονός που θα βλάψει τη διαδικασία ανάπτυξής σας και θα αυξήσει το επιχειρηματικό κόστος. Η προσοχή είναι το κλειδί!

Αλλά όλα ειπώθηκαν και έγιναν. Η Python είναι έτοιμη για παραγωγή να προσφέρει ελαφριά απόδοση όταν πρόκειται για πλαίσια web. Αν τόσο καιρό σκεφτόσασταν να μεταφερθείτε στο Node, τώρα δεν χρειάζεται! 🙂

Ακούγεται καλό? Master Python σήμερα!