99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

uvloop —— 超級(jí)快的 Python 異步網(wǎng)絡(luò)框架

發(fā)布時(shí)間:2017-06-08 20:42  回復(fù):0  查看:2929   最后回復(fù):2017-06-08 20:42  

asyncio是遵循Python標(biāo)準(zhǔn)庫(kù)的一個(gè)異步 I/O框架.本文將介紹 uvloop: 可以完整替代asyncio事件循環(huán).uvloop是用Cython寫的,基于 libuv。一起來(lái)看看吧,希望對(duì)大家學(xué)習(xí)Python標(biāo)準(zhǔn)庫(kù)有所幫助。

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

  asyncio uvloop

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

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

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

  · 執(zhí)行 DNS 查詢,

  · 處理 OS 操作系統(tǒng)信號(hào)

  · 對(duì)創(chuàng)建服務(wù)器和連接進(jìn)行封裝

  · 子進(jìn)程異步處理

  目前 uvloop 只支持 *nix 平臺(tái)和 Python 3.5。

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

  $ pip install uvloop

  在你的 asyncio 代碼中使用 uvloop 非常簡(jiǎn)單:

  import asyncioimport uvloopasyncio.set_event_loop_policy(uvloop.EventLoopPolicy())

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

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

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

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

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

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

  基準(zhǔn)測(cè)試

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

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

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

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

  TCP

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

  可以點(diǎn)擊這里查看完整的TCP基準(zhǔn)報(bào)告。
uvloop —— 超級(jí)快的 Python 異步網(wǎng)絡(luò)框架

每個(gè)位置的一些意見:

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

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

  3. curio-streams。 CurioPython aio 庫(kù)上的新成員。 與asyncio-streams類似,在這個(gè)基準(zhǔn)測(cè)試中,我們測(cè)試了curio 流,使用curio.make_streams()來(lái)創(chuàng)建了一對(duì)(reader, writer),它提供了一些高級(jí)的API,如readline()。

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

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

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

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

  8. asyncio??雌饋?lái)普通的asyncio非常的快速!跟第24點(diǎn)類似,我們測(cè)試了一個(gè)最小的回聲協(xié)議,它是使用純Pythonasyncio所實(shí)現(xiàn)的。

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

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

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

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

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

  HTTP

  最初,我們想要在asynciouvloop上針對(duì)nodejsGo進(jìn)行測(cè)試。aiohttp是使用asyncio編寫異步HTTP服務(wù)器和客戶端 最流行的框架。

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

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

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

uvloop —— 超級(jí)快的 Python 異步網(wǎng)絡(luò)框架

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

  Go1 KiB響應(yīng)情況下要更快些,但是uvloopasyncio的組合卻在10/100 KiB響應(yīng)情況下要快很多。使用httptoolsasynciouvloop的服務(wù)質(zhì)量非常棒,對(duì)于Go來(lái)說(shuō)也一樣。

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

  Conclusion

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

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

 

來(lái)源:36大數(shù)據(jù)

您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?