App下載

Python最快Web框架

猿友 2021-04-09 11:12:40 瀏覽數(shù) (2109)
反饋

如果說(shuō)要用 Python 進(jìn)行 web 開(kāi)發(fā),我想你一定會(huì)告訴我 使用 Flask 或者 Django 再或者 tornado, 用來(lái)用去無(wú)非就這三種框架??赡芄?github 多的朋友還會(huì)說(shuō)一個(gè) fastapi。但是,皇上,時(shí)代變了,大清… 亡了!??!

速度為先

當(dāng)下,python都已經(jīng)更新到了 Python3.9.3 了,如果你還沒(méi)有使用過(guò) asyncio、和 Python3.5 新增的 async/await 語(yǔ)法,那說(shuō)明你可能真的是桃花源人,問(wèn)今是何世,不知有漢,無(wú)論魏晉了。

在當(dāng)下,基于 async/await 語(yǔ)法的異步 Web 框架也有很多,在 github 上找一找比比皆是是,那究竟應(yīng)該選哪一款呢?在 github 上有一個(gè)專(zhuān)門(mén)測(cè)試各種語(yǔ)言各種 Web 框架速度的項(xiàng)目,我們來(lái)看一看簡(jiǎn)單的數(shù)據(jù):

這是所有的 Python Web 框架速度測(cè)試,有人可能會(huì)問(wèn)為什么不是從 1 開(kāi)始排序的,因?yàn)檫@個(gè)項(xiàng)目的測(cè)試還包含 golang、java、php 等眾多語(yǔ)言的 Web 框架,共有 226 款。這里我們只用 Python 來(lái)做對(duì)比。

可以明顯的看到,flask、django、tornado 等老牌的 Python Web 框架已經(jīng)快要墊底了。

wow, 這個(gè)速度絕了??赡苣銈冞€在懷疑這個(gè)速度如何測(cè)試的,給你們看一下測(cè)試源碼:

# Disable all logging features
import logging

logging.disable()


from flask import Flask
from meinheld import patch

patch.patch_all()

app = Flask(__name__)


@app.route("/")
def index():
    return ""


@app.route("/user/<int:id>", methods=["GET"])
def user_info(id):
    return str(id)


@app.route("/user", methods=["POST"])
def user():
    return ""
復(fù)制代碼
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt


def index(request):
    return HttpResponse(status=200)


def get_user(request, id):
    return HttpResponse(id)


@csrf_exempt
def create_user(request):
    return HttpResponse(status=200)
復(fù)制代碼
# Disable all logging features
import logging

logging.disable()


import tornado.httpserver
import tornado.ioloop
import tornado.web


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        pass


class UserHandler(tornado.web.RequestHandler):
    def post(self):
        pass


class UserInfoHandler(tornado.web.RequestHandler):
    def get(self, id):
        self.write(id)


app = tornado.web.Application(
    handlers=[
        (r"/", MainHandler),
        (r"/user", UserHandler),
        (r"/user/(\d+)", UserInfoHandler),
    ]
)
復(fù)制代碼
# Disable all logging features
import logging

logging.disable()

import multiprocessing

from sanic import Sanic
from sanic.response import text


app = Sanic("benchmark")


@app.route("/")
async def index(request):
    return text("")


@app.route("/user/<id:int>", methods=["GET"])
async def user_info(request, id):
    return text(str(id))


@app.route("/user", methods=["POST"])
async def user(request):
    return text("")


if __name__ == "__main__":
    workers = multiprocessing.cpu_count()
    app.run(host="0.0.0.0", port=3000, workers=workers, debug=False, access_log=False)
復(fù)制代碼

就是簡(jiǎn)單的不做任何操作,只返回響應(yīng),雖然這樣測(cè)試沒(méi)有任何實(shí)際意義,在正常的生產(chǎn)環(huán)境中不可能什么都不做,但是如果所有的框架都如此測(cè)試,也算是從一定程度上在同一起跑線上了吧。

OK,就這么多,說(shuō)到這里你也應(yīng)該知道我想要說(shuō)的這個(gè)異步框架是誰(shuí)了,沒(méi)錯(cuò),我們今天的主角就是 Sanic。

sanic

為什么要用異步 Web 框架?

這可能是眾多小伙伴最先想到的問(wèn)題了吧?我用 Django、Flask 用的好好的,能夠完成正常的任務(wù),為什么還要用異步 Web 框架呢?

asyncio

說(shuō)到這里,首先我要反問(wèn)你你一個(gè)問(wèn)題,你認(rèn)為在 Web 開(kāi)發(fā)過(guò)程中我們最大的敵人是誰(shuí)?思考 5 秒鐘,然后看看我的回答:

在 Web 開(kāi)發(fā)的過(guò)程中,我們最大的敵人不是用戶,而是阻塞!

是的,而異步可以有效的解決 網(wǎng)絡(luò) I/O 阻塞,文件 I/O 阻塞。具體的阻塞相關(guān)的文章推薦查看深入理解 Python 異步編程。由于異步可以提升效率,所以對(duì)于 Python 來(lái)說(shuō),異步是最好的提升性能的方式之一。這也是為什么要選擇 異步 Web 框架的原因。

生態(tài)環(huán)境

可能有的小伙伴還是會(huì)說(shuō),你為什么不推薦 falcon 而是推薦 Sanic ?明明它的速度非??欤?Sanic 快了那么多,那您看一下下面的代碼:

from wsgiref.simple_server import make_server
import falcon


class ThingsResource:
    def on_get(self, req, resp):
        """Handles GET requests"""
        resp.status = falcon.HTTP_200  # This is the default status
        resp.content_type = falcon.MEDIA_TEXT  # Default is JSON, so override
        resp.text = ('\nTwo things awe me most, the starry sky '
                     'above me and the moral law within me.\n'
                     '\n'
                     '    ~ Immanuel Kant\n\n')

app = falcon.App()

things = ThingsResource()

app.add_route('/things', things)

if __name__ == '__main__':
    with make_server('', 8000, app) as httpd:
        print('Serving on port 8000...')

        httpd.serve_forever()

一個(gè)狀態(tài)碼都要自己定義和填寫(xiě)的框架,我想它的速度快是值得肯定的,但是對(duì)于開(kāi)發(fā)者來(lái)說(shuō),又有多少的實(shí)用價(jià)值呢?所以我們選擇框架并不是要選最快的,而是要又快又好用的。

而大多數(shù)框架并不具備這樣的生態(tài)環(huán)境,這應(yīng)該也是為什么大多數(shù) Python 的 Web 開(kāi)發(fā)者愿意選擇 Django 、 Flask 、 tornado 的原因。就是因?yàn)樗鼈兊纳鷳B(tài)相對(duì)于其他框架要豐富太多太多。


可是,如今不一樣了。Sanic 框架, 從 2016 年 5 月開(kāi)始 發(fā)布了第一版異步 Web 框架雛形,至今已經(jīng)走過(guò)了 5 個(gè)年頭,這 5 年,經(jīng)過(guò)不斷地技術(shù)積累,Sanic 已經(jīng)由一個(gè)步履蹣跚的小框架變成了一個(gè)健步如飛的穩(wěn)重框架。

在 awesome-sanic 項(xiàng)目中,記錄了大量的第三方庫(kù),你可以找到任何常用的工具:從 API 到 Authentication,從 Development 到 Frontend,從 Monitoring 到 ORM,從 Caching 到 Queue… 只有你想不到的,沒(méi)有它沒(méi)有的第三方拓展。

生產(chǎn)環(huán)境

以前我在國(guó)內(nèi)的社區(qū)中看到過(guò)一些小伙伴在問(wèn) 2020 年了,Sanic 可以用于生產(chǎn)環(huán)境了嗎?

sanic生產(chǎn)環(huán)境

答案是肯定的,筆者以親身經(jīng)歷來(lái)作證,從19年底,我們就已經(jīng)將 Sanic 用于生產(chǎn)環(huán)境了。彼時(shí)的 Sanic 還是 19.9,筆者經(jīng)歷了 Sanic 19.9 -- 21.3 所有的 Sanic 的版本,眼看著 Sanic 的生態(tài)環(huán)境變得越來(lái)越棒。

還有一個(gè)問(wèn)題可能你們不知道,Sanic 在創(chuàng)建之初目標(biāo)就是創(chuàng)建一個(gè)可以用于生產(chǎn)環(huán)境的 Web 框架??赡苡行┛蚣軙?huì)明確的說(shuō)明框架中自帶的 Run 方法僅用于測(cè)試環(huán)境,不要使用自帶的 Run 方法用于部署環(huán)境。但是 Sanic 所創(chuàng)建的不止是一個(gè)用于測(cè)試環(huán)境的應(yīng)用,更是可以直接用在生產(chǎn)環(huán)境中的應(yīng)用。省去了使用 unicorn 等部署的煩惱!

文檔完善

想必大多數(shù) Python 的 Web 開(kāi)發(fā)者 學(xué)的第一個(gè)框架就是 Flask 或者 Django 吧,尤其是 Django 的文檔,我想大多數(shù)小伙伴看了都會(huì)心塞。因?yàn)榕f的版本有中文,但是新的版本,尤其是新特性,完全沒(méi)有任何中文文檔了?。。?!這對(duì)于關(guān)注 Django 發(fā)展但英文又不是強(qiáng)項(xiàng)的同學(xué)來(lái)說(shuō),簡(jiǎn)直苦不堪言。

但 Sanic 擁有完善的 中文用戶指南 和 API 文檔,這些都是由貢獻(xiàn)者自主發(fā)起的,官方承認(rèn)的文檔,由翻譯者進(jìn)行翻譯貢獻(xiàn),由 Sanic 官方團(tuán)隊(duì)進(jìn)行發(fā)布?;蛟S有的小伙伴會(huì)說(shuō) Flask 也有完善的中文文檔,但是那是在不同的站點(diǎn)上的,Sanic 的所有文檔都有 Sanic 官方進(jìn)行發(fā)布支持。且目前 Sanic 還在持續(xù)支持 韓語(yǔ)、葡萄牙語(yǔ)等更多的語(yǔ)種。

sanic文檔完善

社區(qū)指導(dǎo)

和其他框架不同,您或許能夠在百度上找到論壇、頻道等,但這些都是經(jīng)過(guò)本地漢化的,運(yùn)營(yíng)者往往并不是官方,且其中夾雜了很多廣告。很顯然,如果是官方運(yùn)營(yíng)的不可能允許這種情況出現(xiàn)。

Sanic 不同于其他的社區(qū),所有的論壇、頻道完全由官方運(yùn)營(yíng),在這里,你可以向核心開(kāi)發(fā)者提問(wèn)問(wèn)題,Sanic 的官方發(fā)布經(jīng)理也非常樂(lè)意回答各種問(wèn)題。你也可以和志同道合的使用者分享自己的使用經(jīng)驗(yàn)。這是一個(gè)完全開(kāi)放的環(huán)境….

Sanic 目前常用的有 論壇、Discord、github issues、twitter、Stackoverflow

sanic社區(qū)指導(dǎo)

大家可以在以上的方式中關(guān)注 Sanic 的發(fā)展以及尋求社區(qū)幫助。

sanic社區(qū)幫助

你還在等什么?還不趕緊去試一下?最后,以 Sanic 的愿景結(jié)尾:Build Faster, Run Faster !

轉(zhuǎn)載自:https://juejin.cn/post/6944598601674784775

以上就是小編為你整理的關(guān)于Java 中 == 和 equals 區(qū)別是什么? 的全部?jī)?nèi)容



0 人點(diǎn)贊