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。