如何停止任务?
要取消正在运行的 asyncio 任务,可以使用 asyncio.Task 对象的 cancel() 方法。当任务被取消时,cancel() 方法将返回 True,否则返回 False。如果任务已经完成,则无法取消,此时 cancel() 方法也将返回 False。在任务下一次运行时,它将触发 CancelledError 异常。如果 CancelledError 在包装协程内未被处理,任务将被取消。如果异常在协程内部被处理,任务将不会被取消。
...
# cancel the task
was_cancelled = task.cancel()
如何取消正在运行的任务?
以下是如何取消一个正在运行的 asyncio 任务的示例:
#import asyncio
# 定义一个协程作为任务
async def task_coroutine():
print('任务执行中')
try:
await asyncio.sleep(1)
except asyncio.CancelledError:
print('任务被取消')
raise
# 主协程
async def main():
print('主协程开始')
# 创建并调度任务
task = asyncio.create_task(task_coroutine())
await asyncio.sleep(0.1) # 稍等片刻让任务开始运行
# 取消任务
task.cancel()
try:
await task
except asyncio.CancelledError:
print('任务已成功取消')
print('主协程结束')
# 启动 asyncio 程序
asyncio.run(main())
在这个示例中,main() 协程启动了一个任务协程,并在稍后取消它。任务协程尝试休眠,但由于被取消,它捕获了 CancelledError 异常并报告任务已被取消。然后,主协程等待取消的任务并处理 CancelledError。
如何等待任务完成?
要等待任务完成,可以直接使用 await 等待 asyncio.Task 对象:
await task
如何从任务中获取返回值?
# coroutine that returns a value
async def other_coro():
return 100
协程可以包装在 asyncio.Task 对象中。这有助于独立执行协程而无需当前协程等待它。
...
# wrap coroutine in a task and schedule it for execution
task = asyncio.create_task(other_coro())
要从任务中获取返回值,可以在任务完成后使用 await 获取返回值,或者使用 task.result() 方法:
我们可以等待任务来检索返回值。如果任务已安排或正在运行,则调用者将挂起,直到任务完成并提供返回值。如果任务完成,将立即提供返回值。
...
# get the return value from a task
value = await task
与协程不同,我们可以多次等待任务而不会引发错误。
...
# get the return value from a task
value = await task
# get the return value from a task
value = await task
...
# get the return value from a task
value = task.result()
注意,task.result() 需要在任务完成后调用,否则会引发 InvalidStateError 异常。如果任务被取消,它将引发 CancelledError 异常。