python asyncio

網(wǎng)絡(luò)模型有很多中,為了實(shí)現(xiàn)高并發(fā)也有很多方案,多線程,多進(jìn)程。無論多線程和多進(jìn)程,IO的調(diào)度更多取決于系統(tǒng),而協(xié)程的方式,調(diào)度來自用戶,用戶可以在函數(shù)中yield一個狀態(tài)。使用協(xié)程可以實(shí)現(xiàn)高效的并發(fā)任務(wù)。Python的在3.4中引入了協(xié)程的概念,可是這個還是以生成器對象為基礎(chǔ),3.5則確定了協(xié)程的語法。下面將簡單介紹asyncio的使用。實(shí)現(xiàn)協(xié)程的不僅僅是asyncio,tornado和gevent都實(shí)現(xiàn)了類似的功能。

event_loop 事件循環(huán):程序開啟一個無限的循環(huán),程序員會把一些函數(shù)(實(shí)際上就是協(xié)程)注冊到事件循環(huán)上。當(dāng)滿足事件發(fā)生的時候,調(diào)用相應(yīng)的協(xié)程函數(shù)。
coroutine 協(xié)程:協(xié)程對象,指一個使用async關(guān)鍵字定義的函數(shù),它的調(diào)用不會立即執(zhí)行函數(shù),而是會返回一個協(xié)程對象。協(xié)程對象需要注冊到事件循環(huán),由事件循環(huán)調(diào)用。
task 任務(wù):一個協(xié)程對象就是一個原生可以掛起的函數(shù),任務(wù)則是對協(xié)程進(jìn)一步封裝,其中包含任務(wù)的各種狀態(tài)。
future: 代表將來執(zhí)行或沒有執(zhí)行的任務(wù)的結(jié)果。它和task上沒有本質(zhì)的區(qū)別
async/await 關(guān)鍵字:python3.5 用于定義協(xié)程的關(guān)鍵字,async定義一個協(xié)程,await用于掛起阻塞的異步調(diào)用接口。

阻塞和await

使用async可以定義協(xié)程對象,使用await可以針對耗時的操作進(jìn)行掛起,就像生成器里的yield一樣,函數(shù)讓出控制權(quán)。協(xié)程遇到await,事件循環(huán)將會掛起該協(xié)程,執(zhí)行別的協(xié)程,直到其他的協(xié)程也掛起或者執(zhí)行完畢,再進(jìn)行下一個協(xié)程的執(zhí)行。

并發(fā)

asyncio實(shí)現(xiàn)并發(fā),就需要多個協(xié)程來完成任務(wù),每當(dāng)有任務(wù)阻塞的時候就await,然后其他協(xié)程繼續(xù)工作。創(chuàng)建多個協(xié)程的列表,然后將這些協(xié)程注冊到事件循環(huán)中。

底層實(shí)現(xiàn)

python asyio實(shí)現(xiàn)單線程異步模式, 實(shí)際上底層運(yùn)用了I/O多路復(fù)用方法。用戶態(tài)同步I/O模擬的異步請求。
event_loop實(shí)際上就是一個I/O多路復(fù)用器,在linux上使用的是epoll.
程序員把協(xié)程函數(shù)注冊到事件循環(huán)上,asyio底層首先執(zhí)行系統(tǒng)調(diào)用返回文件描述符,比如執(zhí)行網(wǎng)絡(luò)請求,然后將該套接字描述符和回調(diào)函數(shù)等封裝成一個請求。然后注冊到I/O多路復(fù)用器上, 當(dāng)獲取到數(shù)據(jù)之后,執(zhí)行回調(diào)函數(shù),然后再將回調(diào)函數(shù)的返回值返回給協(xié)程函數(shù)。

參考:http://python.jobbole.com/87310/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容