Python異步怎么使用等待有時間限制協程
本文講解"Python異步如何使用等待有時間限制協程",希望能夠解決相關問題。
我們可以使用 asyncio.wait_for() 函數等待 asyncio 任務或協程超時完成。如果在任務完成之前超時已過,任務將被取消。
1. 什么是 Asyncio wait_for()
asyncio.wait_for() 函數允許調用者等待 asyncio 任務或協程超時完成。如果沒有指定超時,wait_for() 函數將等待直到任務完成。如果在任務完成之前指定了超時并超時,那么任務將被取消。
這允許調用者既可以設置他們愿意等待任務完成的時間,又可以通過在超時結束時取消任務來強制執(zhí)行超時。
現在我們知道了 asyncio.wait_for() 函數是什么,讓我們看看如何使用它。
2. 如何使用 Asyncio wait_for()
asyncio.wait_for() 函數接受一個等待和超時。等待對象可能是協程或任務。必須指定超時,并且可以是無超時、整數或浮點秒數。wait_for() 函數返回一個協程,該協程在明確等待或作為任務調度之前不會執(zhí)行。
... # wait for a task to complete await asyncio.wait_for(coro, timeout=10)
如果提供協程,則在執(zhí)行 wait_for() 協程時將其轉換為任務。如果在任務完成之前超時已過,任務將被取消,并引發(fā) asyncio.TimeoutError,這可能需要處理。
... # execute a task with a timeout try: # wait for a task to complete await asyncio.wait_for(coro, timeout=1) except asyncio.TimeoutError: # ...
如果等待的任務因未處理的異常而失敗,則該異常將傳播回等待 wait_for() 協程的調用者,在這種情況下可能需要處理它。
... # execute a task that may fail try: # wait for a task to complete await asyncio.wait_for(coro, timeout=1) except asyncio.TimeoutError: # ... except Exception: # ...
接下來,讓我們看看如何在超時時調用 wait_for()。
3. 帶有超時的 Asyncio wait_for() 示例
我們可以探索如何在任務完成之前等待具有超時的協程。在此示例中,我們執(zhí)行上述協程,但調用方等待 0.2 秒或 200 毫秒的固定超時?;叵胍幌拢幻氲扔?1,000 毫秒。
任務協程被修改,使其休眠一秒以上,確保超時總是在任務完成之前到期。
# SuperFastPython.com # example of waiting for a coroutine with a timeout from random import random import asyncio # coroutine to execute in a new task async def task_coro(arg): # generate a random value between 0 and 1 value = 1 + random() # report message print(f'>task got {value}') # block for a moment await asyncio.sleep(value) # report all done print('>task done') # main coroutine async def main(): # create a task task = task_coro(1) # execute and wait for the task without a timeout try: await asyncio.wait_for(task, timeout=0.2) except asyncio.TimeoutError: print('Gave up waiting, task canceled') # start the asyncio program asyncio.run(main())
運行示例首先創(chuàng)建 main() 協程并將其用作 asyncio 程序的入口點。main() 協程創(chuàng)建任務協程。然后它調用 wait_for() 并傳遞任務協程并將超時設置為 0.2 秒。
main()協程被掛起,執(zhí)行task_coro()。它報告一條消息并休眠片刻。main() 協程在超時結束后恢復。 wait_for()協程取消task_coro()協程,main()協程掛起。
task_coro() 再次運行并響應要終止的請求。它引發(fā) TimeoutError 異常并終止。main() 協程恢復并處理由 task_coro() 引發(fā)的 TimeoutError。
這突出顯示了我們如何調用帶超時的 wait_for() 函數,并在任務未在超時內完成時取消任務。
由于使用了隨機數,程序每次運行時的輸出都會不同。
>task got 0.685375224799321
Gave up waiting, task canceled
關于 "Python異步如何使用等待有時間限制協程" 就介紹到此。希望多多支持碩編程。
- python字符串定義的方式有哪些
- python中f字符串以及其常見用法介紹
- 使用Python?Beautiful?Soup解析HTML內容的方法
- Python修改列表元素的方法
- Python?Pyperclip模塊怎么安裝和使用
- Python異步之怎么保護任務免于取消
- python中的Pyperclip模塊功能是什么
- Python錯誤JSONDecodeError:?Expecting?value:?line?1?column?1怎么解決
- Python異步之如何獲取當前和正在運行任務
- Python混合如何使用同步和異步函數
- python操作Excel神器openpyxl如何使用
- Python 網絡編程
- Python 開發(fā)環(huán)境
- Python HTTP響應
- Python FTP
- Python 代理服務器
- Python列出目錄
- Python 遠程過程調用
- Python 基準測試和分析
- Python 線程池