取消任务和设置超时
取消任务
要取消一个协程任务,你可以调用该任务的cancel()
方法。这个操作会使得正在等待的asyncio.sleep()
抛出asyncio.CancelledError
异常。
import asyncio
async def my_coroutine():
print("开始执行")
try:
await asyncio.sleep(5)
except asyncio.CancelledError:
print("任务被取消")
finally:
print("清理工作")
async def main():
task = asyncio.create_task(my_coroutine())
await asyncio.sleep(2) # 等待2秒
task.cancel() # 取消任务
try:
await task
except asyncio.CancelledError:
print("任务已被取消")
asyncio.run(main())
设置超时
要为协程设置超时,你可以使用asyncio.wait_for()
函数。如果任务在指定的时间内没有完成,它将抛出asyncio.TimeoutError
异常。
import asyncio
async def my_coroutine():
print("开始执行")
await asyncio.sleep(5)
print("执行完成")
async def main():
try:
await asyncio.wait_for(my_coroutine(), timeout=3)
except asyncio.TimeoutError:
print("任务超时")
asyncio.run(main())
如果任务超时了,提示超时,但是不终止这个任务
#asyncio.shield的作用是保护一个协程免受取消操作的影响
import asyncio
async def my_coroutine():
print("开始执行")
await asyncio.sleep(5)
print("执行完成")
async def main():
task = asyncio.create_task(my_coroutine())
# 使用asyncio.wait_for来检测超时,但不取消任务
try:
await asyncio.wait_for(asyncio.shield(