Asynkrona Python-ramverk du måste ha koll på

2020-09-03

Python book

Det händer en hel saker i Python-async landskapet just nu. Nya ramverk dyker upp titt som tätt och äldre ramverk skrivs om och utvecklas för att stötta async-funktionalitet. Det pågår en hel del experimentation och många ramverk dyker upp och testar olika idéer. Det är viktigt att komma ihåg att du behöver tänka långsiktigt kring dina teknikval, speciellt om du ska stötta system som körs i produktion och har tusentals användare.

Vi på Will & Skill, en digitalbyrå baserad i Stockholm, lägger stor vikt vid att lyfta ögonen med jämna mellanrum och utforska nya sätt att skapa lösningar som låter oss leverera lösningar av hög kvalitet.

I denna artikel kikar vi på några nya ramverk i Python-djungeln och ger en kort sammanfattning kring de nyheter som berör främst asynkrona ramverk.

Async och Python?

Asynkronprogrammering är numera en integrerad del av Pythons standardbibliotek. Om du är en webbutvecklare med intresse inom Python-utveckling så finns det flera intressanta alternativ att utforska.

För inte så länge sedan var asynkron programmering eller asynkronutveckling ett ”buzzword”. Ramverk som NodeJS och Go gjorde det till en avgörande faktor i hur kod bör skrivas samt exekveras. Det var dessutom den största fördelen med ramverket och allting kretsade kring async.

Async-stöd i Pythons standardbibliotek

Efter lanseringen av asyncio biblioteket i samband med Python 3.5 så hoppade även Python communityt på async-tåget. Python som Javascript har anammat async/await principen som underlättar hur man skriver kod som kan exekveras asynkront. Detta är märkvärdigt just på grund av att Python-communityt inte gör ändringar i standardbibilioteket utan eftertanke och omsorg. Detta är en stark indikation på att async/await är här för att stanna.

Nu när portarna öppnats till asynkron-programmering så börjar både existerande och nya ramverk anpassa sin kodbas till att kunna köra sin exekvering asynkront. Iochmed detta så har antalet nya ramverk som använder sig utav async-principen exploderat i antal.


Python möjliggör tusentals anrop i sekunden

Prestanda som en gång i tiden enbart var möjligt i NodeJS är nu inte alls märkvärdigt bland vissa Python-ramverk som klarar tusentals anrop i sekunden. Så länge din kod inte är CPU-tung så borde du kunna åstadkomma rätt bra prestanda utan alltför mycket ansträngning.

De som har hållit på med Python i ett par år vet att detta inte var möjligt för bara 18 månader sedan. Mycket har hänt och hel del nya spännande saker blommar upp.

Flask

Flask är egentligen inget async-ramverk men den är på många sätt en föregångare till ramverken som nämns i denna artikel. En hel del ramverk använder samma syntax och kodmönster som Flask var först med och har man sysslat med Flask så kommer man att känna igen sig.

Pythonfrom flask import Flask, escape, request

app = Flask(__name__)

@app.route('/')
def hello():
    name = request.args.get("name", "World")
    return f'Hello, {escape(name)}!'

Flask är ett så kallat "Micro Framework" och är ett av världens mest använda ramverk just på grund av dess minimala struktur.

Sanic

Sanic är ett modernt ramverk som har en bra följarskara. Ramverket har inte stöd för versioner äldre än Python 3.6. Sanic har ett väldigt enkelt upplägg och har stöd för async/await.

Syntaxen är enkel att läsa och komma ihåg och det innebär att man kan snabbt komma igång med att skriva en enkel webbapplikation utan att anstränga sig alltför mycket.

Pythonfrom sanic import Sanic
from sanic.response import json

app = Sanic()

@app.route("/")
async def index(request):
    return json({"name": "Faisal"})

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

Sanic är mer eller mindre det async-ramverk som har flest användare i Python-sfären idag. Ramverket kommer med en hel del saker i verktygslådan och de vanligaste problemen har lösts.

Du har allting från routing, middleware, cookies, versionshantering, klassbaserade vyer, hantering av statiska filer, stöd för streaming och sockets samt mycket mer. De saker som inte finns idag är templating, databaslager, filhantering/filsystemstöd, köer och bland annat. Denna funktionalitet kan man importera från andra domänspecifika Python-bibliotek.

FastAPI

FastAPI är ett ramverk som är relativt nytt men har fått en hel del beröm för att de har bra dokumentation och de har väldigt mycket funktionalitet som du får i verktygslådan från dag ett.

Det finns även

Pythonfrom fastapi import FastAPI

app = FastAPI()

@app.get("/users/me")
async def me_detail():
    return {"id": 12345, "name": "Faisal"}

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

Författaren av FastAPI studerade både existerannde Python ramverk som Django och Sanic men man har även lånat idéer och kodmönster från ramverk som NodeJS baserade NestJS som är ett ramverk som är skrivet i TypeScript. Du kan läsa mer om deras tankar och filosofi här.

Vibora

Vibora är ett ramverk som lägger stor vikt vid prestanda. Rent syntaxmässigt är det närbesläktat med Sanic.

OBS: Vibora kommer att skrivas om och en hel del saker kommer att ändras. Ha det i åtanke ifall du använder detta ramverk i ett skarpt projekt.

I denna tabell så kan du se hur snabb Vibora är i jämförelse med andra ramverk. Länk till jämförelsetabell hos Github Ta dessa jämförelsetal med en nypa salt då en hel del prestanda beror på hur din app är uppsatt och vilken arkitektur du har valt.

Pythonfrom vibora import Vibora, JsonResponse

app = Vibora()

@app.route('/')
async def index():
    return JsonResponse({'name': 'Faisal'})

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

Både syntax och funktionalitet är jämförbart med Sanic och det finns en hel del saker som lösts i Vibora som ännu inte lösts i Sanic men Sanic är fortfarande mer moget och stabilt samt har större användarbas.

Sammanfattning

Det händer en hel saker i Python-async landskapet just nu. Nya ramverk dyker upp titt som tätt och äldre ramverk skrivs om och utvecklas för att stötta async-funktionalitet.

Det pågår en hel del experimentation och många ramverk dyker upp och testar olika idéer. Det är viktigt att komma ihåg att du behöver tänka långsiktigt kring dina teknikval, speciellt om du ska stötta system som körs i produktion och har tusentals användare.

Dessa trender inom Python är väldigt lovande och vi tror att ekosystemet kommer att få en enorm boost vad gäller innovation och experimentation. Python-communityt jobbar för fullt med att skapa de rätta förutsättningarna för att stötta nya typer av stabila asynkrona applikationer som kan hantera en stor mängd last.

Nyfiken på att veta mer om Python-ramverk?

Är någon av dessa ramverk intressant för din organisation? Will & Skill är en stockholmsbaserad reklambyrå som specialiserar sig på att skriva backend-applikationer med hjälp av Pythonbaserade ramverk som bland annat Django och Flask. Tveka inte att höra av dig till oss på Will & Skill för att diskutera mer om just din tech-stack och behov!