iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python使用asyncio异步时的常见问题总结
  • 133
分享到

Python使用asyncio异步时的常见问题总结

Python asyncio异步常见问题Python asyncio异步Python asyncio 2023-05-16 12:05:42 133人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录1. 如何停止任务?2. 如何等待任务完成?3. 如何从任务中获取返回值?4. 如何在后台运行任务?5. 如何等待所有后台任务?1. 如何停止任务? 我们可以通过 asyncio

1. 如何停止任务?

我们可以通过 asyncio.Task 对象上的 cancel() 方法取消任务。如果任务被取消,cancel() 方法返回 True,否则返回 False。

...
# cancel the task
was_cancelled = task.cancel()

如果任务已经完成,则无法取消,cancel() 方法将返回 False,任务不会处于已取消状态。

下次任务有机会运行时,它将引发 CancelledError 异常。如果 CancelledError 异常未在包装协程内处理,任务将被取消。

否则,如果在包装协程内处理了 CancelledError 异常,任务将不会被取消。cancel() 方法还可以接受一个消息参数,该参数将在 CancelledError 的内容中使用。

我们可以探索如何取消正在运行的任务。

在这个例子中,我们定义了一个任务协程,它报告一条消息然后阻塞片刻。

然后我们定义用作 asyncio 程序入口点的主协程。它报告一条消息,创建并安排任务,然后等待片刻。

然后主协程在运行时恢复和取消任务。它再等一会儿,让任务响应取消请求。然后主协程报告取消任务的请求是否成功。

任务被取消,然后完成。主协程然后在关闭程序之前报告任务的状态是否已取消。

# SuperFastpython.com
# example of canceling a running task
import asyncio
 
# define a coroutine for a task
async def task_coroutine():
    # report a message
    print('executing the task')
    # block for a moment
    await asyncio.sleep(1)
 
# custom coroutine
async def main():
    # report a message
    print('main coroutine started')
    # create and schedule the task
    task = asyncio.create_task(task_coroutine())
    # wait a moment
    await asyncio.sleep(0.1)
    # cancel the task
    was_cancelled = task.cancel()
    # report whether the cancel request was successful
    print(f'was canceled: {was_cancelled}')
    # wait a moment
    await asyncio.sleep(0.1)
    # check the status of the task
    print(f'canceled: {task.cancelled()}')
    # report a final message
    print('main coroutine done')
 
# start the asyncio program
asyncio.run(main())

运行该示例会启动 asyncio 事件循环并执行 main() 协程。main() 协程报告一条消息,然后创建并调度任务协程。然后它暂停并等待片刻以允许任务协程开始运行。任务运行,报告消息并休眠一段时间。

main() 协程恢复和取消任务。它报告取消任务的请求已成功。然后它会休眠片刻,让任务响应要取消的请求。

task_coroutine() 恢复并引发 CancelledError 异常,导致任务失败并完成。main()协程恢复并报告任务是否处于取消状态。在这种情况下,确实如此。

此示例突出显示了取消正在运行的任务的正常情况。

main coroutine started
executing the task
was canceled: True
canceled: True
main coroutine done

2. 如何等待任务完成?

我们可以通过直接等待 asyncio.Task 对象来等待任务完成。

...
# wait for the task to finish
await task

我们可以在一行中创建和等待任务。

...
# create and wait for the task to finish
await asyncio.create_task(custom_coro())

3. 如何从任务中获取返回值?

我们可能需要将协程的值返回给调用者。我们可以通过等待从协程中检索返回值。它假定正在等待的另一个协程返回一个值。

# coroutine that returns a value
async def other_coro():
	return 100

等待其他协程将挂起调用协程并安排其他协程执行。一旦另一个协程完成,调用协程将恢复。返回值将从另一个协程传递给调用者。

...
# execute coroutine and retrieve return value
value = await other_coro()

协程可以包装在 asyncio.Task 对象中。这有助于独立执行协程而无需当前协程等待它。

这可以使用 asyncio.create_task() 函数来实现。

...
# wrap coroutine in a task and schedule it for execution
task = asyncio.create_task(other_coro())

有两种方法可以从 asyncio.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 = await task

我们还可以通过调用 asyncio.Task 对象的 result() 方法来获取任务的返回值。

...
# get the return value from a task
value = task.result()

这需要完成任务。如果不是,将引发 InvalidStateError 异常。如果任务被取消,将引发 CancelledError 异常。

4. 如何在后台运行任务?

我们可以通过将协程包装在 asyncio.Task 对象中来在后台运行协程。这可以通过调用 asyncio.create_task() 函数并将其传递给协程来实现。

协程将被包装在一个 Task 对象中,并被安排执行。将返回任务对象,调用者不会挂起。

...
# schedule the task for execution
task = asyncio.create_task(other_coroutine())

至少在当前协程出于任何原因挂起之前,任务不会开始执行。我们可以通过暂停片刻让任务开始运行来帮助解决问题。这可以通过休眠零秒来实现。

...
# suspend for a moment to allow the task to start running
await asyncio.sleep(0)

这将暂停调用者一小会儿,并允许请求运行的机会。这不是必需的,因为调用者可能会在未来某个时间暂停或作为正常执行的一部分终止。一旦调用者没有事情要做,我们也可以直接等待任务。

...
# wait for the task to complete
await task

5. 如何等待所有后台任务?

我们可以等待 asyncio 程序中的所有独立任务。这可以通过首先通过 asyncio.all_tasks() 函数获取一组所有当前正在运行的任务来实现。

...
# get a set of all running tasks
all_tasks = asyncio.all_tasks()

这将返回一个集合,其中包含一个 asyncio.Task 对象,用于当前正在运行的每个任务,包括 main() 协程。

我们不能直接等待这个集合,因为它会永远阻塞,因为它包含当前任务。因此,我们可以获取当前正在运行的任务的 asyncio.Task 对象并将其从集合中删除。

这可以通过首先调用 asyncio.current_task() 方法来获取当前协程的任务,然后通过 remove() 方法将其从集合中删除来实现。

...
# get the current tasks
current_task = asyncio.current_task()
# remove the current task from the list of all tasks
all_tasks.remove(current_task)

最后,我们可以等待剩余的任务集。这将挂起调用者,直到集合中的所有任务都完成。

...
# suspend until all tasks are completed
await asyncio.wait(all_tasks)

将它们结合在一起,下面添加到 main() 协程末尾的代码片段将等待所有后台任务完成。

...
# get a set of all running tasks
all_tasks = asyncio.all_tasks()
# get the current tasks
current_task = asyncio.current_task()
# remove the current task from the list of all tasks
all_tasks.remove(current_task)
# suspend until all tasks are completed
await asyncio.wait(all_tasks)

到此这篇关于Python使用asyncio异步时的常见问题总结的文章就介绍到这了,更多相关Python asyncio异步内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python使用asyncio异步时的常见问题总结

本文链接: https://www.lsjlt.com/news/209715.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python使用asyncio异步时的常见问题总结
    目录1. 如何停止任务?2. 如何等待任务完成?3. 如何从任务中获取返回值?4. 如何在后台运行任务?5. 如何等待所有后台任务?1. 如何停止任务? 我们可以通过 asyncio...
    99+
    2023-05-16
    Python asyncio异步常见问题 Python asyncio异步 Python asyncio
  • python爬虫抓取时常见的小问题总结
    目录01 无法正常显示中文?解决方法02 加密问题 03 获取不到网页的全部代码?04 点击下一页时网页网页不变 05 文本节点问题 ...
    99+
    2022-11-12
  • 详细总结Python常见的安全问题
    目录一、输入注入二、assert 语句(Assert statements)三、计时攻击(Timing attacks)四、临时文件(Temporary files)五、使用 yam...
    99+
    2022-11-12
  • 总结Golang编程时常见的错误和问题
    Golang(又称 Go)是一种相对较新的编程语言,逐渐受到了越来越多人的欢迎。尽管 Golang 与早期的编程语言有许多不同之处,但其出现的初衷一直都是为了方便程序员进行编写和管理高效的代码。在使用 Golang 进行编程时,有一些常见的...
    99+
    2023-05-14
  • C语言在输入输出时遇到的常见问题总结
    目录一、前言二、取整的方法(1)使用 int 强制转换(2)使用floor函数向下取整(3)使用ceil函数向上取整三、数值四舍五入(1)使用round函数进行四舍五入(2)使用ri...
    99+
    2022-11-13
  • JS使用Promise时常见的5个错误总结
    目录1.避免 Promise 地狱2.在 Promise 中使用 try/catch 块3.在 Promise 块内使用异步函数4.在创建 Promise 后立即...
    99+
    2022-11-13
    JS Promise 错误 JS Promise Promise 错误
  • 详解C#异步多线程使用中的常见问题
    目录异常处理线程取消临时变量线程安全异常处理 小伙伴有没有想过,多线程的异常怎么处理,同步方法内的异常处理,想必都非常非常熟悉了。那多线程是什么样的呢,接着我讲解多线程的异常处理 首...
    99+
    2022-11-12
  • JS利用循环解决的一些常见问题总结
    目录1. 打印0-100中3的倍数2. 在页面中写入 1000-2000年中的闰年3. 打印100以内所有偶数的和4.求出1-1/2+1/3-1/4……1...
    99+
    2022-11-13
  • win8系统使用时遇到的常见问题汇总及解答
    不少电脑爱好者朋友现在都在关注最新微软windows 8系统,根据微软最新官方消息,WIN8系统也将在本月底发布最新消费者预览版,供尝鲜朋友抢先体验WIN8,针对近期不少朋友都常问的一些windows 8问...
    99+
    2022-06-04
    常见问题 系统
  • fastadmin使用学习中的常见问题汇总
    目录一、fastadmin后台能访问,前台路径错误 ,前台路径错误,后台又能访问。二、使用fastadmin随机生成的入口文件报模板不存在三、去掉表格中默认的搜索样式四、控制器方法中...
    99+
    2022-12-17
    fastadmin常见问题汇总
  • C#异步多线程使用中的常见问题有哪些
    本篇内容主要讲解“C#异步多线程使用中的常见问题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#异步多线程使用中的常见问题有哪些”吧!异常处理小伙伴有没有想过,多线程的异常怎么处理,同步...
    99+
    2023-06-22
  • 使用pytorch时所遇到的一些问题总结
    使用pytorch时所遇到的问题总结 1、ubuntu vscode切换虚拟环境 在ubuntu系统上,配置工作区文件夹所使用的虚拟环境。之前笔者误以为只需要在vscode内置的终端...
    99+
    2022-11-12
  • 解决python调用matlab时的一些常见问题
    为什么要用python调用matlab? 我自己的有些数据结构涉及到hash查找,在python中key是tuple形式,在matlab中支持hash查找的数据结构只有contain...
    99+
    2022-11-11
  • 风讯CMS使用时遇到的常见问题
    关键字描述:常见问题 遇到 使用 &rdquo &ldquo 权限 提示 是否 文件 系统在使用的时候可能出现各种情况,根据详细的提示信息,分别找到解决的办法,目前遇到的可能不全面,只是把常见的列出来,以供大家参考。 ...
    99+
    2022-06-12
    常见问题 遇到 使用 &rdquo 提示 权限 是否 文件
  • MySQL使用的常见问题解决与应用技巧汇总
    前言 在MySQL日常开发或者是维护中,有一些问题或是故障往往是难以避免的,如丢失密码、表损坏。在此总结一下常见的问题,以备今后所需。 一、 忘记 MySQL 的 root 密码 1. 登录到数据库所在的...
    99+
    2022-10-18
  • 使用Spark时的一些常见问题和解决办法
    这篇文章主要讲解了“使用Spark时的一些常见问题和解决办法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“使用Spark时的一些常见问题和解决办法”吧!首先来说说spark任务运行完后查错最...
    99+
    2023-06-02
  • 使用ip代理时会遇到哪些常见的问题
    本篇文章为大家展示了使用ip代理时会遇到哪些常见的问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、授权问题很多用户在开通ip代理后,发现API提取链接生成后,无法提取IP,或者提取IP后无法全...
    99+
    2023-06-15
  • Python使用signal定时结束AsyncIOScheduler任务的问题
    在使用aiohttp结合apscheduler的AsyncIOScheduler模拟定点并发的时候遇到两个问题 在调度器scheduler.start()后,程序直接退出(在Jupiter中任务可以正常启...
    99+
    2022-06-02
    Python定时结束AsyncIOScheduler任务 Python signal AsyncIOScheduler任务
  • 总结使用Spring BeanUtils避免各种诡异的属性拷贝问题
    本篇内容主要讲解“总结使用Spring BeanUtils避免各种诡异的属性拷贝问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“总结使用Spring Bean...
    99+
    2022-10-19
  • 在RedHat系统上使用yum指令时会出现的常见问题
    小编给大家分享一下在RedHat系统上使用yum指令时会出现的常见问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在RedHat系统上使用yum指令时出现如下问...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作