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