簡說Python Web非同步框架

王平發表於2019-01-16

時間過得真快,轉眼之間已經是2019年了。好幾年前,做web開發時,我們選擇了Python的tornado框架,看重的是它的輕量級(簡潔)和非同步(說實話,沒怎麼用非同步)。

後來,開始用Python 3,同時也接觸了asyncio,對非同步IO有了跟深入的理解和掌握。asyncio模組提供了在單執行緒上通過協程實現併發的基礎框架,複用網路sockets和其它資源上的IO訪問。簡單說,就是在讀寫網路、檔案等IO裝置時通過併發來提高效能。

web-framework

寫爬蟲也用asyncio替換了原來的gevent,最明顯的感觸就是,抓取速度沒有多大變化但是系統資源消耗大大減少,那麼同樣的伺服器就可以大大提高抓取效率了。

非同步爬蟲是在客戶端應用非同步IO,同樣的,我們也可以在伺服器端使用非同步IO。今天,我們就聊聊Python眾多的非同步IO Web 框架。

著名的github上有個程式碼庫:awesome-asyncio,大家集思廣益整理了python asyncio 相關的庫。當然,也有好心的國人翻譯成了中文版: awesome-asyncio-cn。

我們先來看看其中關於Web框架部分,看看哪些著名的非同步Web框架上榜了:

python web 框架清單

好傢伙,數量還真不少,真是應了那句“Python就是出了名的庫多”。下面,我挑幾個比較熟悉的來介紹一下。

一、Sanic

Sanic是一個支援 async/await 語法的非同步web框架,它的使用類似Flask,同時使用了基於libuv的事件迴圈庫uvloop,使得它的效能大大提高。

為了寫這篇文章特意其它的github主頁看了一下,發現竟然改變了很多,有了自己的官網: https://sanicframework.org/ 。沒錯,它現在是一個開源社群了。並且有了新的logo:

Python sanic框架

Sanic建立了自己的社群,有了新的版本釋出週期,開發活躍了起來,最近也是釋出了好多版本,形勢一片大好。希望Sanic擼起袖子幹出來一個精品框架!

本來是想去找一下它很早之前做的一個效能對比測試,可是現在它拿掉了。因為,這個測試只是簡單的“hello world”測試,一直被人詬病。不過,官方正在著手新的效能測試,今年年初應該有個結果。

好在github有歷史記錄,把這個效能對比再拿出來看一下,當時就是看到這個結果才上了Sanic的船,不過確實沒選錯,用下來感覺還是很棒的,Web就應該和非同步IO搭配才完美。

python web框架效能比較

從這個結果看,Sanic確實是很誘人的。當然,一個web網站不能是簡單的“Hello Word”,更多的是後臺邏輯處理、資料庫讀寫等。

二、Tornado 框架

Tornado是Python 2時代的明星,比起Django的笨重來它更輕巧,贏得了很多人的喜愛,也包括本人。多年前,開始接觸Web開發就是從它開始的。到了Python 3 這個非同步盛行的時代,Tornado 有些廉頗老矣。雖然它有非同步支援,但是各種測試來看,都敵不過後起之秀的強勁。如果你現在想開始web開發,就不要用它了,去擁抱Sanic吧。

三、Japronto! 框架

先看看這個對比結果驚訝一下下吧:

python web框架io比較

為什麼秒殺所有框架,還包括Go語言的框架呢?其實,它底層都是C語言寫的,基本上就是用Python給C語言套了個盒子,高效能都來自C語言。管它怎麼實現的呢,用著爽就行了。可是,它還是一個早期開發版本,作者自己也不推薦大家用,並且還推薦大家去用Sanic。

這個框架值得關注。

四、Vibora 框架

這又是一個令人驚訝的框架,用cython(C語言)實現了很多底層的東西,所以速度也是槓槓的。雖然處於早期開發階段,但是github上已經有四千多個星星了,令人不可小覷。

這一圈瞭解下來,Python的非同步Web框架還處在一個群雄逐鹿的戰國時代,還沒有哪一個特別出彩。這個時候選擇Sanic似乎應該不錯。

github上有一個全面的web框架測試對比,有興趣可以瞭解下
這裡

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章