1 模塊簡介
asyncio模塊作為一個(gè)臨時(shí)的庫,在Python 3.4版本中加入。這意味著,asyncio模塊可能做不到向后兼容甚至在后續(xù)的Python版本中被刪除。根據(jù)Python官方文檔,asyncio通過coroutines、sockets和其它資源上的多路復(fù)用IO訪問、運(yùn)行網(wǎng)絡(luò)客戶端和服務(wù)端以及其它相關(guān)的原始服務(wù)等提供了一種單線程并發(fā)應(yīng)用的架構(gòu)。本文并不能覆蓋所有關(guān)于asyncio模塊的技術(shù)點(diǎn),但是你可以學(xué)到如何去使用這個(gè)模塊,以及為什么它是有用的。
如果你在一些較老的Python版本中需要一些類似于asyncio模塊的技術(shù),你可以看Twisted或者gevent。
2 模塊使用
2.1 定義
asyncio模塊提供了一種關(guān)于事件循環(huán)的框架。事件循環(huán)就是等待一些任務(wù)發(fā)生,然后執(zhí)行相應(yīng)的事件。它也會(huì)處理例如IO操作或者系統(tǒng)事件。asyncio實(shí)際中有好幾種循環(huán)實(shí)現(xiàn)方式。模塊默認(rèn)使用的方式是其所運(yùn)行的操作系統(tǒng)上最有效的方式。如果你愿意,你也可以顯式地選擇其它事件循環(huán)方式。一個(gè)事件循環(huán)就是當(dāng)事件A發(fā)生時(shí),函數(shù)B共同起作用。
設(shè)想這樣一個(gè)場景,服務(wù)器等待用戶訪問并請(qǐng)求一些資源,例如網(wǎng)頁。如果這個(gè)網(wǎng)站不是非常知名的網(wǎng)站,這個(gè)服務(wù)器將會(huì)在很長的時(shí)間內(nèi)處于空閑狀態(tài)。但是,一旦某個(gè)時(shí)間用戶點(diǎn)擊了這個(gè)網(wǎng)站,服務(wù)器就需要作出響應(yīng)。這個(gè)響應(yīng)就是事件處理。當(dāng)一個(gè)用戶下載網(wǎng)頁,服務(wù)器將會(huì)去檢查并調(diào)用一個(gè)或者多個(gè)事件句柄。一旦這些事件句柄完成相應(yīng)的處理,它們需要將控制交回給事件循環(huán)。為了在Python中完成這個(gè)任務(wù),asyncio使用協(xié)程。
協(xié)程是一個(gè)特殊的函數(shù),可以將控制交回給它的調(diào)用函數(shù),但是并不丟失它的狀態(tài)。協(xié)程是一個(gè)消費(fèi)者函數(shù),并且是生成器的擴(kuò)展。協(xié)程相比線程最大的優(yōu)勢(shì)就是執(zhí)行協(xié)程時(shí)不需要占用太多內(nèi)存。你需要注意的是,當(dāng)你調(diào)用一個(gè)協(xié)程函數(shù),它并沒有真正執(zhí)行。相反,它將會(huì)返回一個(gè)協(xié)程對(duì)象,你可以將這個(gè)協(xié)程對(duì)象傳遞給事件循環(huán),然后可以立即或者稍后執(zhí)行它。
當(dāng)你在使用asyncio模塊時(shí),另一個(gè)你可能會(huì)執(zhí)行的是future。future就是一個(gè)可以表示還沒有結(jié)束的任務(wù)結(jié)果的對(duì)象。你的事件循環(huán)可以觀察future對(duì)象并等待它們結(jié)束。當(dāng)一個(gè)future結(jié)束時(shí),它被設(shè)置為已完成。asyncio模塊也支持鎖和信號(hào)。
本文最后一部分,我將會(huì)提到Task。Task是協(xié)程的一個(gè)框架,是Future的一個(gè)子類。你可以在事件循環(huán)中對(duì)Task進(jìn)行調(diào)度。
2.2 async和await
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26