关于 Asyncio,别再使用run_until_complete了

news2024/9/25 7:23:32

熟悉Python 的 Asyncio 进行异步编程的小伙伴肯定对下面的写法不陌生:

import asyncio

async def test():
    await asyncio.sleep(3)
    print("Test rersult")

loop = asyncio.get_event_loop()
loop.run_until_complete(test())

这种写法也是在网上搜到的最多的协程运行方式,但从 Python3.7 版本开始,官方引入了一个新的、更简单的运行方式asincio.run,同样是实现上面代码的功能,我们就可以使用以下的方式:

async def test():
    await asyncio.sleep(3)
    print("Test rersult")

asyncio.run(test())

只需要一行即可,是不是更简单了?

下面我们直接从源码来看以下run()方法是如何实现的:

def run(main, *, debug=None):
    """Execute the coroutine and return the result.

    This function runs the passed coroutine, taking care of
    managing the asyncio event loop and finalizing asynchronous
    generators.

    This function cannot be called when another asyncio event loop is
    running in the same thread.

    If debug is True, the event loop will be run in debug mode.

    This function always creates a new event loop and closes it at the end.
    It should be used as a main entry point for asyncio programs, and should
    ideally only be called once.

    Example:

        async def main():
            await asyncio.sleep(1)
            print('hello')

        asyncio.run(main())
    """
    if events._get_running_loop() is not None:
        raise RuntimeError(
            "asyncio.run() cannot be called from a running event loop")

    if not coroutines.iscoroutine(main):
        raise ValueError("a coroutine was expected, got {!r}".format(main))

    loop = events.new_event_loop()
    try:
        events.set_event_loop(loop)
        if debug is not None:
            loop.set_debug(debug)
        return loop.run_until_complete(main)
    finally:
        try:
            _cancel_all_tasks(loop)
            loop.run_until_complete(loop.shutdown_asyncgens())
            loop.run_until_complete(loop.shutdown_default_executor())
        finally:
            events.set_event_loop(None)
            loop.close()
  1. 先看注释Execute the coroutine,所以我们可以知道 main 需要是一个协程对象,而代码的第36、37 两行(源码中的行数,上文中正式代码的的第 4、5 行)也是对入餐 main 做了相应的校验,如果不是协程对象则会报错ValueError

  2. 注释:If debug is True, the event loop will be run in debug mode.是针对参数 debug 的,所以 debug 的类型应该是一个 bool 型,即 True or False,如果是 True 则会以 debug 模式运行。

  3. 正文的前三行,是检查当前环境中有没有已经在运行中的事件循环,如果有的话则报错。

  4. 经过前面5 行的相关检查验证后,开始了正式的逻辑处理代码。第一个 try 语句块中,我们看到了熟悉的内容,set_event_looprun_until_complete,所以 run()方法其实就是把我们熟悉的协程运行方式进一步的进行了包装,形成了更高层级的调用方法(也是官方推荐的调用方式)。

    Tips:针对debug 只做了不为 None 的判断,那么是不是我们可以把 debug 设置为任意值呢?答案是不可以,因为 set_debug()方法的实现逻辑在BaseEventLoop类中,而BaseEventLoop类继承自events.AbstractEventLoop,该类是一个抽象类,数据类型校验在events.pyi 文件中,在该文件中注明了 set_debug 方法的入参为 bool 类型。

  5. try 语句块中完成了协程代码的运行逻辑部分,那么finally语句块中的内容就是完成了注释中的closes it at the end了。在这部分代码中,一共包含了三个方法:

    • _cancel_all_tasks(loop):该方法中首先获取了所有的 task(task 是协程中一个重要的概念),将所有的 task 做了取消操作,并且再次将 task 运行run_until_complete(),保证执行完所有的任务。再对所有的任务做判断,有异常则抛出规范化的内容。
    • 在循环中运行loop.shutdown_asyncgens()方法,关闭所有的异步生成器,即对所有的生成器调用aclose()关闭方法。
    • shutdown_default_executor():关闭默认执行器。在 3.9 版本中新增了该方法,在以前的版本中只有shutdown_asyncgens()方法。该方法调用了线程的关闭程序来关闭执行器(默认为ThreadPoolExecutor),完善了多种协程的调用方式下的关闭释放动作。
  6. 最后一个finally语句块中,关闭事件循环

 

以上就是对asyncio.run()方法源码的解读,如有错误欢迎指出。同时官方也推荐使用该方法,大家用起来吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712909.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VUE小白学习-官方网站资料学习-2023年5月22日

VUE小白学习-官方网站资料学习-2023年5月22日 VUE干啥的?单文件组件?官方说,VUE前端万金油。 日期:2023年5月22日 VUE干啥的? 是一个前端框架,有自己的一套规则,方便前端开发。 单文件组件&am…

企业微信扫码登陆-详细案例

以下是实现的pc端企微扫码登陆,话不多时,直接上代码。。。 第1步:企业微信自建应用 第二步:获取到之后拿到 整体流程: 1.企业发起授权登录请求,企业微信用户允许授权后,企业微信会重定向到企业…

Windows基于WSL搭建Python数据分析环境

最近配置了一台较为不错的台式机,记录下自己配置环境的过程。 安装WSL,提供Linux环境 如果你发现后续的命令无法运行或者说软件商城中找不到,这可能意味着你的操作系统不符合要求。WSL安装要求 Windows 10 version 2004(Build 19…

C++之H数回信

void H数(int 数) {int Lin 数;while (Lin>1){if (!(Lin % 2) || !(Lin % 3) || !(Lin % 5) || !(Lin % 7)){if (!(Lin % 2))Lin / 2;else if (!(Lin % 3))Lin / 3;else if (!(Lin % 5))Lin / 5;else if (!(Lin % 7))Lin / 7;}else return;}cout << 数 << ends…

Proxmox 8.0 “Virtual Environment”发布

导读Proxmox发布新产品Proxmox VE8.0&#xff0c;基于Debian 12.该版本集成了新的Linux内核6.2、QEMU 8.0.2、LXC 5.0.2和OpenZFS 2.1.12&#xff0c;并且还有其他一些新功能和改进。 更新的部分包括更新的Ceph服务器、安装程序ISO增加基于文本的用户界面、整合主机网络桥和VN…

STM32 Proteus UCOSII系统DS1302万年历时钟秒表控制系统-0056

STM32 Proteus UCOSII系统DS1302万年历时钟秒表控制系统-0056 Proteus仿真小实验&#xff1a; STM32 Proteus UCOSII系统DS1302万年历时钟秒表控制系统-0056 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 LCD1602显示器多个按键DS1302北京时间 1.单片机程序使…

java 分布式事务seata的使用

首先创建一个seata的springboot模块并引入seata的起步依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency>模块的目录结构如下 seata.yaml中的内容为&…

vscode高亮插件——highlight-words(高亮代码、高亮变量、突出显示)

文章目录 官方教程高亮文字使用方法配置 演示变量高亮&#xff08;Highlight Toggle Current&#xff09;选择高亮&#xff08;Highlight Selection with Options&#xff09;删除高亮&#xff08;Highlight Remove&#xff09;侧边栏&#xff08;Highlight Toggle Sidebar&…

软件测试用例编写规范文档,模板都给你了我看谁还不会写测试用例

目录 前言 一 概述 1.1目的 1.2使用范围 二 测试用例编写原则 2.1系统性 2.2连贯性 2.3全面性 三 测试用例设计方法 3.1 等价类划分法&#xff1a; 3.2 边界值分析法&#xff1a; 3.3 因果图法&#xff1a; 3.4功能图法 3.5错误推测法 四 测试用例编写规范 4.1…

【ARM】-指令预取中止异常中断处理程序的返回

文章目录 处理流程示例 处理流程 在指令预取时&#xff0c;如果目标地址是非法的&#xff0c;该指令被标记成有问题的指令。这时&#xff0c;流水线上该指令之前的指令继续执行。当执行到该被标记成有问题的指令时&#xff0c;处理器产生指令预取中止异常中断。 当发生指令预取…

解决进入虚拟环境venv后pip路径仍然是在全局路径usr/bin下的问题

问题 解决方法 尝试手动安装pip到你的虚拟环境中。首先&#xff0c;确保在虚拟环境中运行以下命令&#xff1a; python -m ensurepip然后&#xff0c;使用以下命令安装pip到你的虚拟环境中&#xff1a; python -m pip install --upgrade pip

XR-FRAME 开始

目录 新建一个XR组件在页面中使用这个组件添加一个物体来点颜色和灯光有点寡淡&#xff0c;加上图像让场景更丰富&#xff0c;环境数据动起来&#xff0c;加入动画还是不够&#xff0c;放个模型再来点交互组件通信&#xff0c;加上HUD虚拟 x 现实&#xff0c;追加AR能力识别人脸…

ChatGLM6B LORA微调

ChatGLM6B&ChatGLM2-6B微调 目录 ChatGLM6B&ChatGLM2-6B微调 微调硬件需求 3.1. LoRA概述 3.2. LoRA微调ChatGLM步骤 3.2.1. 项目和环境搭建 3.2.2. 数据集处理 3.2.3. 微调 3.2.4. 推理 3.2.5. 完整过程 3.3. LoRA微调ChatGLM步骤-——huggingface PEFT 3.3.1. 项目和…

通过动态地址解决网络数据采集问题

动态地址的作用 说到Python网络爬虫&#xff0c;很多人都会遇到困难。最常见的就是爬取过程中IP地址被屏蔽。虽然大部分都是几个小时内自动解封的&#xff0c;但这对于分秒必争的python网络爬虫来说&#xff0c;是一个关键性的打击&#xff01;当一个爬虫被阻塞时&#xff0c;…

Qt项目环境构建

工欲善其事必先利其器&#xff0c;使用Qt来进行开发&#xff0c;得先配置好一个合适的环境。下面是我关于Qt项目环境构建的一些小结 Qt的项目构建主要依赖.pro文件&#xff08;和.pri文件&#xff1a;include包含文件&#xff0c;提供pro的复用性高的东西给多个项目包含) 所以新…

【企业架构框架】Mitre 架构联邦

定义&#xff1a; 架构联合是用于企业架构开发、维护和使用的框架&#xff0c;它对齐、定位和链接分离但相关的架构和架构信息&#xff0c;以向用户提供无缝的外观。 关键词&#xff1a; 企业架构&#xff0c;联邦架构&#xff0c;适合联邦&#xff0c;语义对齐&#xff0c;分层…

想要做好联络口译,需要掌握哪些技能?

据了解&#xff0c;联络口译员经常需要陪在外宾或者委托人身边出席各种各样的活动&#xff0c;除了翻译工作之外&#xff0c;有时还要兼任接待、导游等工作。那么&#xff0c;想要做好联络口译工作&#xff0c;需要掌握哪些技能&#xff1f; 首先&#xff0c;熟悉中外文化差异及…

在页面里面引入外部网页或者vue的其他页面组件

<div id"iframe-container"><iframe :src"iframeUrl" width"100vw" height"100vh" v-if"flagTwo"></iframe> </div>//可以是路径也可以是网络链接 data(){ return{iframeUrl :, }this.iframeUrl h…

从0到1精通自动化测试,pytest自动化测试框架,Hooks函数获取用例执行结果(二十三)

一、前言 pytest提供的很多钩子(Hooks)方法方便我们对测试用例框架进行二次开发&#xff0c;可以根据自己的需求进行改造 先学习下pytest_runtest_makereport这个钩子方法&#xff0c;可以更清晰的了解用例的执行过程&#xff0c;并获取到每个用例的执行结果 二、pytest_run…

【Part 1】现在去博物馆都预约不上了,黑产多少有点疯狂了

近几年不知道为啥&#xff0c;突然兴起博物馆热了&#xff0c;去某个城市&#xff0c;总想去当地的博物馆去打卡&#xff08;当然&#xff0c;可能重点还在打卡&#xff09;。但是周末去湖南省博物馆&#xff0c;发现免费的博物馆&#xff0c;现在已经预约不上了&#xff0c;最…