1. 程式人生 > 其它 >python非同步--async與await使用

python非同步--async與await使用

python在3.5以後引入async和await來強化自身的非同步程式設計,提升效率。今天只是簡單的介紹下async和await的使用以及作用。至於原理性的東西以後會在寫文章解釋

首先先看一個例子

import requests,asyncio,time


#async申明此函式是非同步函式,區別於原來的普通函式
async def test2(i):
     r = await other_test(i)
     print(i,r)


async def other_test(i):
     r = requests.get(i)
     print(i)

     """
1.await的作用是掛起函式,等待函式操作完成,這時候回去執行其他的非同步函式,而不是傻等 2.等掛起的函式執行完成以後將會從其他非同步函式處返回,執行掛起結束的函式 3.await只可以對非同步函式使用,普通函式使用會報錯 """ await asyncio.sleep(4) print(time.time()-start) return r url = ["https://segmentfault.com/p/1210000013564725", "https://www.jianshu.com/p/83badc8028bd",
"https://www.baidu.com/"] #開啟一個迴圈事件 loop = asyncio.get_event_loop() #使用futur封裝非同步函式,以便後去使用loop執行性 task = [asyncio.ensure_future(test2(i)) for i in url] start = time.time() #迴圈事件開始執行並監聽taks任務,在這個時候非同步的函式才會真正的被執行 loop.run_until_complete(asyncio.wait(task)) endtime = time.time()-start print(1111,endtime)
#關閉迴圈事件 loop.close() #執行結果 #https://segmentfault.com/p/1210000013564725 #https://www.jianshu.com/p/83badc8028bd #https://www.baidu.com/ #4.535935163497925 #https://segmentfault.com/p/1210000013564725 <Response [200]> #4.798289060592651 #https://www.jianshu.com/p/83badc8028bd <Response [403]> #5.0793280601501465 #https://www.baidu.com/ <Response [200]> #1111 5.079607248306274

總結:

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

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

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