searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

python异步:常见问题

2023-12-11 03:31:38
4
0

如何停止任务?

要取消正在运行的 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 异常。

0条评论
作者已关闭评论
l****n
6文章数
0粉丝数
l****n
6 文章 | 0 粉丝
原创

python异步:常见问题

2023-12-11 03:31:38
4
0

如何停止任务?

要取消正在运行的 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 异常。

文章来自个人专栏
python之异步
2 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0