asyncio.Task 对象
asyncio.Task
是 asyncio 中表示并发任务的主要对象,它继承自 Future
并提供了许多有用的方法。下面详细讲解 Task 对象的主要方法。
Task 对象的创建
1. 创建 Task 对象
import asyncioasync def my_coroutine(name, seconds):print(f"{name} 开始")await asyncio.sleep(seconds)print(f"{name} 完成")return f"{name} 结果"# 创建 Task 的几种方式
async def main():# 方法1: asyncio.create_task() (Python 3.7+)task1 = asyncio.create_task(my_coroutine("Task1", 1))# 方法2: asyncio.ensure_future()task2 = asyncio.ensure_future(my_coroutine("Task2", 2))# 方法3: 事件循环的 create_task()task3 = asyncio.get_event_loop().create_task(my_coroutine("Task3", 3))await asyncio.gather(task1, task2, task3)
Task 对象的核心方法
1. cancel()
- 取消任务
async def cancel_me():print('cancel_me(): before sleep')try:# Wait for 1 hourawait asyncio.sleep(3600)except asyncio.CancelledError:print('cancel_me(): cancel sleep')raise # 必须重新抛出异常finally:print('cancel_me(): after sleep')async def main():# Create a "cancel_me" Tasktask = asyncio.create_task(cancel_me())# Wait for 1 secondawait asyncio.sleep(1)task.cancel()try:await taskexcept asyncio.CancelledError:print("main(): cancel_me is cancelled now")asyncio.run(main())# Expected output:
#
# cancel_me(): before sleep
# cancel_me(): cancel sleep
# cancel_me(): after sleep
# main(): cancel_me is cancelled now
2. result()
- 获取任务结果
async def result_demo():task = asyncio.create_task(my_coroutine("结果任务", 1))# 等待任务完成await task# 获取结果try:result = task.result()print(f"任务结果: {result}")except Exception as e:print(f"任务异常: {e}")asyncio.run(result_demo())
output
结果任务 开始
结果任务 完成
任务结果: 结果任务 结果
3. exception()
- 获取任务异常
async def failing_task():await asyncio.sleep(1)raise ValueError("任务出错了!")async def exception_demo():task = asyncio.create_task(failing_task())try:await taskexcept ValueError:pass # 异常已经被处理# 检查任务异常exc = task.exception()if exc:print(f"任务异常: {exc}")print(f"异常类型: {type(exc)}")# asyncio.run(exception_demo())
output
任务异常: 任务出错了!
异常类型: <class 'ValueError'>
4. add_done_callback()
- 添加完成回调
def callback(future):if future.cancelled():print("任务被取消")elif future.exception():print(f"任务异常: {future.exception()}")else:print(f"任务完成,结果: {future.result()}")async def callback_demo():task = asyncio.create_task(my_coroutine("回调任务", 2))task.add_done_callback(callback)# 添加多个回调task.add_done_callback(lambda f: print("第二个回调"))await task# asyncio.run(callback_demo())
output
回调任务 开始
回调任务 完成
任务完成,结果: 回调任务 结果
第二个回调
5. remove_done_callback()
- 移除完成回调
async def remove_callback_demo():def callback1(future):print("回调1")def callback2(future):print("回调2")task = asyncio.create_task(my_coroutine("任务", 1))task.add_done_callback(callback1)task.add_done_callback(callback2)# 移除一个回调task.remove_done_callback(callback1)await task # 只会执行 callback2# asyncio.run(remove_callback_demo())
output
任务 开始
任务 完成
回调2
6. get_name()
/ set_name()
- 任务名称管理
async def name_demo():# 创建时指定名称task = asyncio.create_task(my_coroutine("命名任务", 1), name="我的任务")print(f"任务名称: {task.get_name()}")# 修改名称task.set_name("修改后的任务")print(f"新名称: {task.get_name()}")await task# asyncio.run(name_demo())
output
任务名称: 我的任务
新名称: 修改后的任务
命名任务 开始
命名任务 完成
Task 对象的重要属性
1. done()
- 检查任务是否完成
async def done_demo():task = asyncio.create_task(my_coroutine("完成检查", 2))print(f"任务是否完成: {task.done()}")await asyncio.sleep(1)print(f"1秒后是否完成: {task.done()}")await taskprint(f"等待后是否完成: {task.done()}")# asyncio.run(done_demo())
output
任务是否完成: False
完成检查 开始
1秒后是否完成: False
完成检查 完成
等待后是否完成: True
2. cancelled()
- 检查任务是否被取消
async def cancelled_demo():task = asyncio.create_task(my_coroutine("取消检查", 5))await asyncio.sleep(1)task.cancel()try:await taskexcept asyncio.CancelledError:print(f"任务是否被取消: {task.cancelled()}")
output
取消检查 开始
任务是否被取消: True