在前面也提到過,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())