溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python uvloop框架有什么作用

發(fā)布時間:2021-11-18 09:53:48 來源:億速云 閱讀:217 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Python uvloop框架有什么作用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“Python uvloop框架有什么作用”吧!

簡短介紹

asyncio是遵循Python標(biāo)準(zhǔn)庫的一個異步 I/O框架。

uvloop 使得 asyncio 更快. 實際上,比nodejs,gevent,以及其他任何Python異步框架至少快兩倍 .uvloop  asyncio 基于性能的測試接近于Go程序.

asyncio 和 uvloop

asyncio 模塊, 是在 PEP 3156引入的, 是一個集合,包含網(wǎng)絡(luò)傳輸, 協(xié)議, 和抽象的流, 帶有可插拔的事件循環(huán).  事件循環(huán)是asyncio的核心.它提供如下API:

  • 調(diào)用方法的調(diào)度

  • 通過網(wǎng)絡(luò)傳輸數(shù)據(jù)

  • 執(zhí)行 DNS 查詢,

  • 處理 OS 操作系統(tǒng)信號

  • 對創(chuàng)建服務(wù)器和連接進行封裝

  • 子進程異步處理

目前 uvloop 只支持 *nix 平臺和 Python 3.5。

uvloop 是 Python 內(nèi)建的 asyncio 事件循環(huán)的替代品,你可以通過 pip 來安裝:

$ pip install uvloop

在你的 asyncio 代碼中使用 uvloop 非常簡單:

import asyncio import uvloop asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())

上面的代碼片段讓 asyncio.get_event_loop() 返回一個 uvloop 的實例。

你還可以顯式的創(chuàng)建一個uvloop實例,通過調(diào)用uvloop.new_event_loop()。

體系結(jié)構(gòu)

uvloop是用Cython編寫的,并建立在libuv之上。

libuv是一種高性能的、跨平臺異步的 I/O  類庫,nodejs也使用到了它。由于nodejs是如此的廣泛和流行,可以知道libuv是快速且穩(wěn)定的。

uvloop 實現(xiàn)了所有的asyncio 事件循環(huán)APIs。高級別的Python對象包裝了低級別的libuv 結(jié)構(gòu)體和函數(shù)方法。  繼承可以使得代碼保持DRY(不要重復(fù)自己),并確保任何手動的內(nèi)存管理都可以與libuv的原生類型的生命周期保持同步。

基準(zhǔn)測試

與其它實現(xiàn)相比,為了檢測uvloop棧性能,我們創(chuàng)建了toolbench基準(zhǔn)測試,用于標(biāo)準(zhǔn)的TCP和UNIX套接字I/O,和HTTP協(xié)議性能的基準(zhǔn)  。

基準(zhǔn)測試服務(wù)器運行在一個包含外部負載生成工具 (wrk HTTP 基準(zhǔn)測試)的Docker容器內(nèi),它測試請求吞吐量與延遲。

這篇博客中所有的基準(zhǔn)測試都運行于Intel Xeon CPU E5-1620 v2 @ 3.70GHz的 Ubuntu  Linux系統(tǒng).我們使用的是Python 3.5,所有服務(wù)器都是單核. 此外,Go代碼中使用了GOMAXPROCS=1  ,nodejs沒有使用集群,并且所有的Python服務(wù)器都是單線程.每一個基準(zhǔn)測試集都設(shè)置了TCP_NODELAY標(biāo)識。

在Mac OS X上的基準(zhǔn)報告結(jié)果也很相似。

TCP

這個基準(zhǔn)測試使用不同的消息數(shù)目對一個簡單的回顯服務(wù)器的性能進行了測試。我們分別使用了1, 10, 和100 KiB  的包。并發(fā)級別是10。每一個基準(zhǔn)運行了30秒。

可以點擊這里查看完整的TCP基準(zhǔn)報告。

Python uvloop框架有什么作用

每個位置的一些意見:

  1. asyncio-streams。 asyncio  和其內(nèi)置的純Python實現(xiàn)的事件循環(huán)。在這個基準(zhǔn)測試中,我們測試了高級別的流的抽象的性能。我們使用asyncio.create_server()來創(chuàng)建一個服務(wù)器,把一對(reader,  writer) 傳遞給客戶端協(xié)同程序.

  2. tornado。 這個服務(wù)器實現(xiàn)了一個非常簡單的Tornado 協(xié)議,它能夠把收到的消息立即回復(fù)回去。

  3. curio-streams。 Curio是Python aio 庫上的新成員。  與asyncio-streams類似,在這個基準(zhǔn)測試中,我們測試了curio 流,使用curio.make_streams()來創(chuàng)建了一對(reader,  writer),它提供了一些高級的API,如readline()。

  4. twisted。 跟Tornado類似,我們測試了一個最小的回聲協(xié)議。

  5. curio。這個基準(zhǔn)測試測試了curio 套接字的性能:這是一個實現(xiàn)了sock.recv() 和 sock.sendall()緊密循環(huán)的協(xié)同程序。

  6. uvloop-streams。就如在#2中提到的,這里我們測試了asyncio高級流的性能,只不過這此時基于uvloop。

  7. gevent。在一個緊密循環(huán)里通過使用gevent.StreamServer和一個gevent套接字發(fā)送接受數(shù)據(jù)。

  8. asyncio??雌饋砥胀ǖ腶syncio非常的快速!跟第2和4點類似,我們測試了一個最小的回聲協(xié)議,它是使用純Python的asyncio所實現(xiàn)的。

  9. nodejs。我們使用net.createServer API 在nodejs v4.2.6里測試流的性能。

  10. uvloop。這個基準(zhǔn)測試測試了一個最小的回聲協(xié)議(就如 #2, #4, #8),它是使用基于uvloop的asyncio實現(xiàn)的。 使用1  KiB消息的情況下,uvloop是最快的實現(xiàn),可以高達每秒鐘105,000的請求!使用100 KiB消息的情況下, uvloop的速度可以達到大概2.3  GiB/s。

  11. Go。一個 net.Conn.Read/Write 調(diào)用的緊密循環(huán)。 Golang 性能跟uvloop非常接近,在10 和100  KiB消息情況下會稍微好一些。

所有的基準(zhǔn)測試的代碼可以在這里找到。

也可以查看所有的UNIX套接字基準(zhǔn)測試結(jié)果。

HTTP

最初,我們想要在asyncio和uvloop上針對nodejs和Go進行測試。aiohttp是使用asyncio編寫異步HTTP服務(wù)器和客戶端  ***的框架。

也可以查看完整的HTTP基準(zhǔn)測試報告。

然而,aiohttp 上的性能瓶頸確實其HTTP解析器,它比較慢,因此即使使用的I/O類庫再快也沒什么卵用。為了讓事情更有趣,我們?yōu)? http-parser (nodejs的 HTTP 解析器C類庫,最初是為Nginx研發(fā)的)  創(chuàng)建了一個Python綁定(binding)。這個類庫被命名為httptools,并且在Github和PyPI都可以找到。

對于HTTP,所有的基準(zhǔn)使用wrk 來生成負載。 并發(fā)級別設(shè)置為300。每個基準(zhǔn)的持續(xù)時間為30秒。

Python uvloop框架有什么作用

令人驚奇的是,純Python實現(xiàn)的asyncio在高性能的HTTP解析器的幫助下,比使用同樣HTTP解析器的nodejs表現(xiàn)的快很多!

Go在1 KiB響應(yīng)情況下要更快些,但是uvloop和asyncio的組合卻在10/100  KiB響應(yīng)情況下要快很多。使用httptools的asyncio和uvloop的服務(wù)質(zhì)量非常棒,對于Go來說也一樣。

不可否認(rèn),基于httptools的服務(wù)器非常的小巧,而且不像其他實現(xiàn)那樣不包含任何路由邏輯。盡管如此,這個基準(zhǔn)卻演示了uvloop和一個高效實現(xiàn)的協(xié)議配合能變得多么快速。

Conclusion

我們可以得出結(jié)論, 利用uvloop可以寫出在單CPU內(nèi)核下每秒鐘能夠發(fā)出上萬個請求的Python網(wǎng)絡(luò)代碼。  在多內(nèi)核系統(tǒng)下,可以使用進程池來進一步來改善系統(tǒng)性能。

uvloop 和 asyncio,在加上Python 3.5里  async/await的強大能力,使得使用Python編寫高性能的網(wǎng)絡(luò)代碼更容易了。

到此,相信大家對“Python uvloop框架有什么作用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI