Python之future對象


  參考: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


免責聲明!

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



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