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

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式