7.1 创建任务
模块中的Task
类 asyncio 用于管理协程的执行。
任务(Tasks)
是协程的包装器,允许管理其执行并跟踪其状态。
Task
类允许通过事件循环并行运行协程。
Task
类的主要方法
Task
类是协程的一种包装,提供了以下附加功能:
管理协程执行:
任务使得管理协程的执行、控制其状态以及获得结果变得简单。
取消任务:
取消任务的功能使Task
对于管理可能需要提前停止的长时间操作很有用。
回调函数:
任务支持添加回调函数,使得在任务完成时能执行附加操作。
创建任务:
任务通过函数asyncio.create_task(coroutine)
或方法loop.create_task(coroutine)
创建,这些都会计划协程的执行。
import asyncio
async def say_hello():
print("Hello")
await asyncio.sleep(1)
print("World")
async def main():
task = asyncio.create_task(say_hello())
await task
asyncio.run(main())
7.2 主要方法
方法Task.cancel()
:
请求取消任务。如果任务尚未完成,它将通过引发CancelledError
异常结束。
让我们写一个小程序来展示这一点。
创建一个将等待10秒的异步任务
将其包装到
Task
对象中等待一秒钟以便任务(Task) 开始执行
取消任务 –
task.cancel()
-
如果继续尝试通过
await
运算符等待任务(Task) 完成,我们将获得CancelledError
异常。
import asyncio
async def main():
task = asyncio.create_task(asyncio.sleep(10))
await asyncio.sleep(1)
task.cancel()
try:
await task
except asyncio.CancelledError:
print("Task was cancelled")
asyncio.run(main())
方法Task.result()
:
返回任务的执行结果。如果任务以异常结束,则调用result()
时会引发该异常。
import asyncio
async def main():
task = asyncio.create_task(asyncio.sleep(1, result='Completed'))
result = await task
print(result) # Output: Completed
asyncio.run(main())
在我们的例子中甚至不需要编写额外代码 — await
运算符知道如何处理Task
对象:任务完成后,它将自动调用其result()
方法并返回结果。
方法Task.exception()
:
返回任务引发的异常。如果任务没有异常完成,则返回None
。
import asyncio
async def main():
task = asyncio.create_task(asyncio.sleep(1))
try:
result = await task
except Exception as e:
print(f"Task failed with exception: {e}")
asyncio.run(main())
也不需要编写额外代码 — 如果任务中出现异常,await
运算符会调用exception()
方法。
方法Task.add_done_callback(callback)
:
添加在任务完成时将被调用的回调函数(callback)
。
import asyncio
def callback(future):
print("Task completed")
async def main():
task = asyncio.create_task(asyncio.sleep(1))
task.add_done_callback(callback)
await task
asyncio.run(main())
可以为任务添加一个函数,当任务完成时自动调用。这样的方法使得代码非常灵活。更重要的是,可以为任何任务添加多个函数。
方法Task.done()
:
如果任务已完成(成功、失败或被取消),则返回True
。
import asyncio
async def main():
task = asyncio.create_task(asyncio.sleep(1))
await asyncio.sleep(1.5)
print(task.done()) # Output: True
asyncio.run(main())
使用done()
方法可以知道任务是否已成功完成。更准确地说,任务是否完成或被取消,因为如果发生异常,任务形式上可能未完成,但并未取消。总之,如果任务被取消(cancel)
,那么方法将返回False
,否则返回True
。
GO TO FULL VERSION