1 模塊簡介

asyncio模塊作為一個臨時的庫,在Python 3.4版本中加入。這意味著,asyncio模塊可能做不到向后兼容甚至在后續(xù)的Python版本中被刪除。根據(jù)Python官方文檔,asyncio通過coroutines、sockets和其它資源上的多路復用IO訪問、運行網(wǎng)絡客戶端和服務端以及其它相關的原始服務等提供了一種單線程并發(fā)應用的架構(gòu)。本文并不能覆蓋所有關于asyncio模塊的技術點,但是你可以學到如何去使用這個模塊,以及為什么它是有用的。

如果你在一些較老的Python版本中需要一些類似于asyncio模塊的技術,你可以看Twisted或者gevent。

2 模塊使用

2.1 定義

asyncio模塊提供了一種關于事件循環(huán)的框架。事件循環(huán)就是等待一些任務發(fā)生,然后執(zhí)行相應的事件。它也會處理例如IO操作或者系統(tǒng)事件。asyncio實際中有好幾種循環(huán)實現(xiàn)方式。模塊默認使用的方式是其所運行的操作系統(tǒng)上最有效的方式。如果你愿意,你也可以顯式地選擇其它事件循環(huán)方式。一個事件循環(huán)就是當事件A發(fā)生時,函數(shù)B共同起作用。

設想這樣一個場景,服務器等待用戶訪問并請求一些資源,例如網(wǎng)頁。如果這個網(wǎng)站不是非常知名的網(wǎng)站,這個服務器將會在很長的時間內(nèi)處于空閑狀態(tài)。但是,一旦某個時間用戶點擊了這個網(wǎng)站,服務器就需要作出響應。這個響應就是事件處理。當一個用戶下載網(wǎng)頁,服務器將會去檢查并調(diào)用一個或者多個事件句柄。一旦這些事件句柄完成相應的處理,它們需要將控制交回給事件循環(huán)。為了在Python中完成這個任務,asyncio使用協(xié)程。

協(xié)程是一個特殊的函數(shù),可以將控制交回給它的調(diào)用函數(shù),但是并不丟失它的狀態(tài)。協(xié)程是一個消費者函數(shù),并且是生成器的擴展。協(xié)程相比線程最大的優(yōu)勢就是執(zhí)行協(xié)程時不需要占用太多內(nèi)存。你需要注意的是,當你調(diào)用一個協(xié)程函數(shù),它并沒有真正執(zhí)行。相反,它將會返回一個協(xié)程對象,你可以將這個協(xié)程對象傳遞給事件循環(huán),然后可以立即或者稍后執(zhí)行它。

當你在使用asyncio模塊時,另一個你可能會執(zhí)行的是future。future就是一個可以表示還沒有結(jié)束的任務結(jié)果的對象。你的事件循環(huán)可以觀察future對象并等待它們結(jié)束。當一個future結(jié)束時,它被設置為已完成。asyncio模塊也支持鎖和信號。

本文最后一部分,我將會提到Task。Task是協(xié)程的一個框架,是Future的一個子類。你可以在事件循環(huán)中對Task進行調(diào)度。

2.2 async和await

網(wǎng)友評論