參考:https://www.jianshu.com/p/9643230adadb
協程中更底層的對象:future對象,一般不會直接使用,它是task類的基類,task一部分功能是future提供的,其是更低級的接口,幫助我們去等待異步的結果。例如res=await task1 ,等結果是由future對象來創建的,future對象內部封裝了一個_state的值,維護着狀態,如果變成finished,就不再等待,而是往后執行
task對象繼承future,task對象內部await結果的處理是基於Future對象進行處理的。
示例1:如果沒有任何結果的任何,程序會一直運行
import asyncio async def main(): # 獲取當前事件循環 loop = asyncio.get_running_loop() # 創建future對象 fut = loop.create_future() print(1) # 等待任務最終結果,如果沒有結果會一直等待下去 await fut asyncio.run(main())
輸出如下
分析:執行主協程函數main()以后首先獲取當前的事件循環,然后使用該事件循環創建一個future對象,接下來打印1
然后遇到await fut程序等待fut的結果,因為一直沒有結果所以阻塞,程序一直運行
示例2:手動給future對象賦值。一般不會手動去設置這個。僅了解。
import asyncio async def set_after(fut): await asyncio.sleep(1) fut.set_result('888') async def main(): # 獲取當前事件循環 loop = asyncio.get_running_loop() # 創建future對象,沒綁定任何行為,則這個任務不知道什么時候結束 fut = loop.create_future() # 創建一個任務task對象,綁定了set_after函數,函數內部在等待1秒后會給future賦值 # 手動設置了future任務的最終結果,那么fut就結束了 loop.create_task(set_after(fut)) r1 = await fut print(r1) asyncio.run(main()) # 手動給future賦值 end
運行main()創建事件循環然后使用該事件循環創建一個future,新創建的future是沒有任何任務的,接下來創建一個task綁定任務,set_after(fut)把future作為參數傳遞給函數,函數執行的操作為等待1秒以后給這個future設置一個結束並設置返回的結果。
r1 = await fut是運行future並且把結果賦值給r1,最后打印出r1的值為888