av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Python實(shí)現(xiàn)異步IO的示例

瀏覽:35日期:2022-07-06 11:12:26

前言

用阻塞 API 寫同步代碼最簡單,但一個(gè)線程同一時(shí)間只能處理一個(gè)請求,有限的線程數(shù)導(dǎo)致無法實(shí)現(xiàn)萬級別的并發(fā)連接,過多的線程切換也搶走了 CPU 的時(shí)間,從而降低了每秒能夠處理的請求數(shù)量。為了達(dá)到高并發(fā),你可能會選擇一個(gè)異步框架,用非阻塞 API 把業(yè)務(wù)邏輯打亂到多個(gè)回調(diào)函數(shù),通過多路復(fù)用與事件循環(huán)的方式實(shí)現(xiàn)高并發(fā)。

磁盤 IO 為例,描述了多線程中使用阻塞方法讀磁盤,2 個(gè)線程間的切換方式。那么,怎么才能實(shí)現(xiàn)高并發(fā)呢?

Python實(shí)現(xiàn)異步IO的示例

把上圖中本來由內(nèi)核實(shí)現(xiàn)的請求切換工作,交由用戶態(tài)的代碼來完成就可以了,異步化編程通過應(yīng)用層代碼實(shí)現(xiàn)了請求切換,降低了切換成本和內(nèi)存占用空間。異步化依賴于 IO 多路復(fù)用機(jī)制,比如 Linux 的 epoll 或者 Windows 上的 iocp,同時(shí),必須把阻塞方法更改為非阻塞方法,才能避免內(nèi)核切換帶來的巨大消耗。Nginx、Redis 等高性能服務(wù)都依賴異步化實(shí)現(xiàn)了百萬量級的并發(fā)。

下圖描述了異步 IO 的非阻塞讀和異步框架結(jié)合后,是如何切換請求的。

Python實(shí)現(xiàn)異步IO的示例

然而,寫異步化代碼很容易出錯(cuò)。因?yàn)樗凶枞瘮?shù),都需要通過非阻塞的系統(tǒng)調(diào)用拆分成兩個(gè)函數(shù)。雖然這兩個(gè)函數(shù)共同完成一個(gè)功能,但調(diào)用方式卻不同。第一個(gè)函數(shù)由你顯式調(diào)用,第二個(gè)函數(shù)則由多路復(fù)用機(jī)制調(diào)用。

這種方式違反了軟件工程的內(nèi)聚性原則,函數(shù)間同步數(shù)據(jù)也更復(fù)雜。特別是條件分支眾多、涉及大量系統(tǒng)調(diào)用時(shí),異步化的改造工作會非常困難。

Python如何實(shí)現(xiàn)異步調(diào)用

from flask import Flaskimport timeapp = Flask(__name__)@app.route(’/bar’)def bar(): time.sleep(1) return ’<h1>bar!</h1>’@app.route(’/foo’)def foo(): time.sleep(1) return ’<h1>foo!</h1>’if __name__ == ’__main__’: app.run(host=’127.0.0.1’,port=5555,debug=True)

采用同步的方式調(diào)用

import requestsimport timestarttime = time.time()print(requests.get(’http://127.0.0.1:5555/bar’).content)print(requests.get(’http://127.0.0.1:5555/foo’).content)print('消耗時(shí)間: ',time.time() -starttime)

b’<h1>bar!</h1>’b’<h1>foo!</h1>’消耗時(shí)間: 2.015509605407715

采樣異步的方式調(diào)用:

重點(diǎn):

1.將阻塞io改為非阻塞io;

2.多路復(fù)用io監(jiān)聽內(nèi)核事件,事件觸發(fā)通過回調(diào)函數(shù);

3.用戶態(tài)代碼采取事件循環(huán)的方式獲取事件,執(zhí)行事件的回調(diào)函數(shù);

import selectorsimport socketimport time# from asynrequest import ParserHttpclass asynhttp: def __init__(self): self.selecter = selectors.DefaultSelector() def get(self,url,optiondict = None): global reqcount reqcount += 1 s = socket.socket() s.setblocking(False) try: s.connect((’127.0.0.1’,5555)) except BlockingIOError: pass requset = ’GET %s HTTP/1.0rnrn’ % url callback = lambda : self.send(s,requset) self.selecter.register(s.fileno(),selectors.EVENT_WRITE,callback) def send(self,s,requset): self.selecter.unregister(s.fileno()) s.send(requset.encode()) chunks = [] callback = lambda: self.recv(s,chunks) self.selecter.register(s.fileno(),selectors.EVENT_READ,callback) def recv(self,s,chunks): self.selecter.unregister(s.fileno()) chunk = s.recv(1024) if chunk: chunks.append(chunk) callback = lambda: self.recv(s,chunks) self.selecter.register(s.fileno(), selectors.EVENT_READ, callback) else: global reqcount reqcount -= 1 request_first,request_headers,request_content,_ = ParserHttp.parser(b’’.join(chunks)) print('解析數(shù)據(jù):',request_first,request_headers,request_content) print((b’’.join(chunks)).decode()) return (b’’.join(chunks)).decode()starttime = time.time()reqcount = 0asynhttper = asynhttp()asynhttper.get(’/bar’)asynhttper.get(’/foo’)while reqcount: events = asynhttper.selecter.select() for event,mask in events: func = event.data func()print('消耗時(shí)間:' ,time.time() - starttime)

HTTP/1.0 200 OKContent-Type: text/html; charset=utf-8Content-Length: 13Server: Werkzeug/1.0.1 Python/3.7.7Date: Thu, 15 Oct 2020 03:28:16 GMT

<h1>bar!</h1>HTTP/1.0 200 OKContent-Type: text/html; charset=utf-8Content-Length: 13Server: Werkzeug/1.0.1 Python/3.7.7Date: Thu, 15 Oct 2020 03:28:16 GMT

<h1>foo!</h1>消耗時(shí)間: 1.0127637386322021

以上就是Python實(shí)現(xiàn)異步IO的示例的詳細(xì)內(nèi)容,更多關(guān)于python 異步IO的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: av免费在线观看网站 | 欧美日韩成人 | 免费中文字幕日韩欧美 | 一级久久 | 国产综合亚洲精品一区二 | 青青草伊人网 | 少妇免费视频 | 国产成人精品久久久 | 在线国产91 | 麻豆一区二区三区 | 影音先锋中文字幕在线 | 日韩国产精品一区二区 | 亚洲最大黄色网址 | 欧美日韩四区 | av网站网址 | 欧美日韩一区二 | 国产一级二级三级 | 91精品国产一区二区三区 | 91们嫩草伦理 | 亚洲视频三区 | 久久久蜜桃| 日韩精品视频免费 | 国产一级二级视频 | av一级在线 | 韩国av一区二区 | 999精品在线| 二区三区在线观看 | www.久久.com | 男人天堂久久 | 日韩精品三级 | 黄色大片免费在线观看 | 久久精品一区二区 | 成年人免费看片 | 国产区一区| 久久久在线视频 | 欧美一区二区免费 | 久久精品网 | 欧美一区二区在线视频 | 国产精品美女久久 | 国产在线成人 | 日韩专区在线 |