對python async與await的理解

2021-10-17 02:20:29 字數 2763 閱讀 6413

async/await關鍵字是出現在python3.4以後。網上已經有很多文章對async/await這兩個關鍵字都有講解,包括如何由python2的yield from發展到async/await這兩個關鍵字,以及一些**實現都有。但是對於像我這樣初次接觸的人來說,光看**分析也不一定能理解,我也是在度娘上搜尋很多相關的**,當中也有官網,都沒有發現能讓我一眼看懂在什麼地方可以用await,什麼情況用await的文章。經過自己的重新思考,總算對async、await有一些初步的了解,所以想把自己的理解記錄下來,希望對一些學習協程或者非同步的初學者也有一定的幫助。

舉個例子:假設有1個洗衣房,裡面有10臺洗衣機,有乙個洗衣工在負責這10臺洗衣機。那麼洗衣房就相當於1個程序,洗衣工就相當1個執行緒。如果有10個洗衣工,就相當於10個執行緒,1個程序是可以開多執行緒的。這就是多執行緒!

那麼協程呢?先不急。大家都知道,洗衣機洗衣服是需要等待時間的,如果10個洗衣工,1人負責1臺洗衣機,這樣效率肯定會提高,但是不覺得浪費資源嗎?明明1 個人能做的事,卻要10個人來做。只是把衣服放進去,開啟開關,就沒事做了,等衣服洗好再拿出來就可以了。就算很多人來洗衣服,1個人也足以應付了,開好第一台洗衣機,在等待的時候去開第二台洗衣機,再開第三台,……直到有衣服洗好了,就回來把衣服取出來,接著再取另一台的(哪台洗好先就取哪台,所以協程是無序的)。這就是計算機的協程!洗衣機就是執行的方法。

當你程式中方法需要等待時間的話,就可以用協程,效率高,消耗資源少。

好了!現在來總結一下:

洗衣房 ==> 程序

洗衣工 ==> 執行緒

洗衣機 ==> 方法(函式)

正常的函式在執行時是不會中斷的,所以你要寫乙個能夠中斷的函式,就需要新增async關鍵。

async 用來宣告乙個函式為非同步函式,非同步函式的特點是能在函式執行過程中掛起,去執行其他非同步函式,等到掛起條件(假設掛起條件是sleep(5))消失後,也就是5秒到了再回來執行。

await 用來用來宣告程式掛起,比如非同步程式執行到某一步時需要等待的時間很長,就將此掛起,去執行其他的非同步程式。await 後面只能跟非同步程式或有__await__屬性的物件,因為非同步程式與一般程式不同。假設有兩個非同步函式async a,async b,a中的某一步有await,當程式碰到關鍵字await b()後,非同步程式掛起後去執行另乙個非同步b程式,就是從函式內部跳出去執行其他函式,當掛起條件消失後,不管b是否執行完,要馬上從b程式中跳出來,回到原程式執行原來的操作。如果await後面跟的b函式不是非同步函式,那麼操作就只能等b執行完再返回,無法在b執行的過程中返回。如果要在b執行完才返回,也就不需要用await關鍵字了,直接呼叫b函式就行。所以這就需要await後面跟的是非同步函式了。在乙個非同步函式中,可以不止一次掛起,也就是可以用多個await。

1

async

deftest2

(i):

2 r =

await other_test(i)

3print

(i,r)45

async

defother_test

(i):

6 r = requests.get(i)

7print

(i)8

await asyncio.sleep(4)

9print

(time.time(

)-start)

10return r

1112 url =

["",13

"",14

""]15

16 loop = asyncio.get_event_loop(

)17 task =

[asyncio.ensure_future(test2(i)

)for i in url]

18 start = time.time()19

20 loop.run_until_complete(asyncio.wait(task)

)21 endtime = time.time(

)-start

22print

(endtime)

23 loop.close(

)

輸出結果:

1 

2 3

4 4.425147771835327

5 6 4.5975635051727295

7 8 4.722797632217407

9 10 4.722797632217407

#協程又稱微執行緒,單執行緒,按需,無鎖,程式設計師排程

import time

import asyncio[1

,1,1

,1]#async可以理解宣告了乙個非同步方法

async

def():

await asyncio.sleep(

0.5)1)

async

def(num)

: count=

0while

true:if

len==0:

#time.sleep(.1)

)else:)

count+=

1if count==num:

break

async

def():

bucket=

async10)

:print

(bucket)

loop=asyncio.get_event_loop())

)loop.close(

)

Python async非同步程式設計與同步對比

同步 def test1 for i in range 10 time.sleep 3 print i,test1 def test2 for i in range 15 time.sleep 2 print i,test2 start time time.time test1 test2 end ...

BerkeleyDB與SQLite評測對比

引自http blog.csdn.net mynicedream archive 2008 04 04 2252398.aspx 最近要做乙個專案,需要用到實時資料庫,pi太貴了,想找乙個免費的,實在不行就只能自己編了。找了半天,找到了fastdb berkeleydb和sqlite.fastdb是...

做與對 的哲學

做與對 是個簡單的管理哲學,我第一次看到這句話的時候,確被深深的觸動了一下。中文往往講究言簡意駭,做與對 就深刻的表現了中文的特徵。如果從語義上去分析的話,這句話包含了三個基本的內容。第乙個是 做 描述的是一種行為或者動作 第二個是 做 的物件,隱含在這三個字裡面 第三個是 對 就是對 做 進行檢查...