天天看點

Python3.7 進階程式設計之 async/await asyncio Future可等待對象、異步的實作

在前面也提到過,Python中Future對象是可以在await語句中使用的可等待對象,它具體用法,以及如何實作異步,如下例代碼所示

import asyncio, time


# Python 異步的實作 非阻塞
# Python Future對象屬于可等待對象,是以可以在其他協程中被等待
async def set_after(fut, delay, value):
    await asyncio.sleep(delay)
    print('輸出異步執行的結果')
    # 将future的結果抛出
    fut.set_result(value)

# 模拟一個耗時的其他任務
def compute_add(x,y):
    time.sleep(2)
    print('運作完畢...')
    return x + y

async def main():
    print(f"all started at {time.strftime('%X')}")

    loop = asyncio.get_running_loop() # 傳回目前 系統 線程中正在運作的事件循環。
    # 建立一個Future對象 它是可等待對象 可以在await語句中使用 可以了解為把協程變成了一個Future對象,可以讓Future對象在最開始的時候執行,然後在最後等待它的執行結果
    fut = loop.create_future()
    # 建立任務并執行
    loop.create_task(set_after(fut, 3, '... world'))

    # 執行其他的任務,并不會影響上面 Future對象 任務
    # print('hello ...')
    print(compute_add(7, 8))

    # 取決于要在哪裡等待結果 和nodejs不同的地方就在于,nodejs可以不去等待,當程式自己執行完畢後會退出,而Python這裡需要自己去思考在哪裡等待結果,當所有任務執行完畢 才退出
    print(await fut)

    print(f"all finished at {time.strftime('%X')}")

asyncio.run(main())