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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM