Python异步编程框架asyncio使用方法

news2025/2/2 11:43:33

asyncio概念

Python异步编程框架asyncio是Python 3.4及以上版本提供的一个标准库,用于编写异步IO并发代码。asyncio提供了一种基于协程的高效的方式来实现异步编程,它可以使我们在单线程中处理大量的并发IO操作,提高程序的并发能力和性能。

asyncio的优点:

  1. 异步I/O操作的执行效率高,能够在单线程处理大量并发请求。
  2. 编写异步代码的表达能力强,代码可读性高,易于维护。
  3. 支持协程,使得代码的流程控制更加灵活。

asyncio的缺点:

  1. asyncio需要编写异步的代码,与传统的同步编程方式有较大的差异,需要具有一定的异步编程经验。
  2. 虽然asyncio提供了高效的异步编程方式,但是在计算密集型任务方面并不占优势。

asyncio的应用场景:

  1. Web应用程序的高并发处理;
  2. IO密集型任务处理,如网络爬虫、文件读写等;
  3. 实时消息传递、推送等。

asyncio的使用方式:

  1. 定义可等待对象(coroutine);
  2. 创建事件循环(event loop);
  3. 将可等待对象注册到事件循环中;
  4. 运行事件循环。

在应用程序开发中,我们可以利用asyncio编写高效的异步代码,提升程序的并发处理能力和性能。例如,在Web开发中,我们可以使用asyncio实现高并发处理,快速响应客户端请求;在爬虫开发中,我们可以使用asyncio发送异步的请求,提高爬虫的效率等。

总之,asyncio是一种高效、灵活、可扩展的异步编程框架,具有很高的应用价值,可以使我们更好地进行异步编程、实现高效的并发处理。

示例:使用asyncio实现异步编程

下面是一个简单的例子,说明如何使用asyncio实现异步编程:

import asyncio

# 定义协程函数
async def fun_async():
    print("start")
    await asyncio.sleep(1)  # 模拟IO操作
    print("end")

# 定义一个名为main()的协程函数
async def main():
    tasks = [fun_async(), fun_async(), fun_async()] # 定义多个fun_async()协程任务
    await asyncio.gather(*tasks)                    # 执行多个协程任务


# loop = asyncio.get_event_loop() # 创建事件循环
# loop.run_until_complete(main()) # 运行事件循环,以执行异步操作。
# loop.close()                    # 关闭事件循环

asyncio.run(main()) # 自动创建、运行、关闭事件循环

 

上面的代码中,我们定义了一个名为fun_async()的协程函数,该函数中模拟了一个IO操作,并在操作前后分别输出了"start"和"end"。然后我们定义了一个名为main()的协程函数,它创建了多个fun_async()协程任务,并使用asyncio.gather()函数来运行这些任务。最后,我们创建了一个事件循环并运行它,以执行异步操作。

值得注意的是,在fun_async()函数中调用了await asyncio.sleep(1)来模拟一个IO操作,该操作会释放CPU,使得其他协程可以继续执行,从而实现了异步处理。使用await关键字可以将一个协程函数变为可等待对象(coroutine),从而能够将其注册到事件循环中。

总之,使用asyncio可以通过定义协程函数、创建事件循环、调用协程函数等方式来实现异步编程,从而提升程序的并发处理能力和性能。

报错一:

TypeError: sleep() takes from 1 to 2 positional arguments but 3 were given
sys:1: RuntimeWarning: coroutine 'fun_async' was never awaited

这个错误可能是因为asyncio.sleep()函数的参数个数不正确导致的。asyncio.sleep()函数只有一个参数,表示暂停的时间(以秒为单位),因此如果你在调用该函数时传递了多余的参数或者缺少了参数,就会出现这个错误。

另外,第二个警告信息可能是因为你的代码中定义了一个协程函数,但是没有在代码中使用await关键字调用它,或者在调用该协程函数时遗漏了await关键字。因为协程函数需要使用await关键字将其注册到事件循环中,才能得到正确的执行流程和结果。

下面是一个修复上述错误的例子,给出了一个正确的调用asyncio.sleep()函数的方式,并使用了await关键字来调用协程函数:

import asyncio

async def fun_async():
    print("Start fun_async")
    await asyncio.sleep(1)  # 正确的调用方式
    print("End fun_async")

async def main_async():
    tasks = [fun_async(), fun_async(), fun_async()]  # 定义多个协程任务
    await asyncio.gather(*tasks)  # 执行多个协程任务

if __name__ == '__main__':
    loop = asyncio.get_event_loop()  # 创建事件循环
    loop.run_until_complete(main_async())  # 运行事件循环

在上面的代码中,我们将asyncio.sleep()函数的参数修改为正确的形式,并在调用fun_async()协程函数时使用了await关键字。

报错二:

DeprecationWarning: There is no current event loop
  loop = asyncio.get_event_loop()

这个警告信息通常出现在代码中没有创建事件循环时。在使用asyncio框架时,需要先创建一个事件循环实例,然后将协程函数注册到事件循环中才能运行它们。如果没有创建事件循环,那么就无法运行协程。

下面是一个简单的例子,展示了创建和运行一个协程的基本流程:

import asyncio

async def hello():
    print("Hello world!")

if __name__ == '__main__':
    loop = asyncio.get_event_loop()  # 创建事件循环实例
    loop.run_until_complete(hello())  # 将协程注册到事件循环并运行
    loop.close()  # 关闭事件循环

在上面的代码中,我们使用asyncio.get_event_loop()方法创建了一个事件循环实例,并使用loop.run_until_complete()方法将hello()协程函数注册到事件循环中并运行。最后,我们使用loop.close()方法关闭事件循环。

值得注意的是,如果你在同一个程序中多次创建事件循环,那么可能会出现一些问题。因此建议创建一个全局的事件循环实例,然后在需要使用它的地方引用它。或者使用asyncio.run()方法,它会自动创建和关闭事件循环,使代码更加简洁易读。例如:

import asyncio

async def hello():
    print("Hello world!")

if __name__ == '__main__':
    asyncio.run(hello())  # 自动创建、运行、关闭事件循环

在上面的代码中,我们使用了asyncio.run()方法来运行hello()协程函数,它会自动创建和关闭事件循环,使得代码更加简洁易读。

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

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

相关文章

输入 jar cvf 后指令提示‘jar‘ 不是内部或外部命令,也不是可运行的程序

输入 jar cvf 后指令提示jar 不是内部或外部命令,也不是可运行的程序 一堆说jdk系统环境配置的文章,我都看哭了,还好有这位老兄拯救了我!!!献上地址 https://www.cnblogs.com/wadezhou/p/16647474.html 我输…

AI图像生成无需API开发连接集简云数据表,实现快速增强图片分辨率

1 场景描述 当设计接到一个需求时,按照常规的工作安排,从对接需求到最后完成效果图最短时间都要在5天左右,如果遇到高要求的客户或领导,后期还需要在电脑上进一步调整细节,一张成片起码要花上数小时时间去完成。 而人工…

Python_paramiko_与linux交互

一、基础功能介绍 # codingutf-8 import paramiko from time import sleep# 建立通信 transport paramiko.Transport((192.168.0.7, 22)) print(transport) # <paramiko.Transport at 0x5745ed0 (unconnected)># 建立连接 transport.connect(usernameroot, password1…

redis穿透问题

1.概述 一个热点数据在高并发情况下过期时间到了&#xff0c;会导致大量流量查询redis为null&#xff0c;进而请求数据库进行更新数据&#xff0c;从流量上来说请求打到了数据库上&#xff0c;这种情况可能会造成mysql服务崩溃。 2. 解决方式之一&#xff08;加锁解决之本地锁&…

机器人制作开源方案 | Delta型腿机器狗实现原地动作

1. 功能说明 本文示例将实现R322样机Delta型腿机器狗原地摆臂、原地圆形摆动、原地蹲起、原地踏步的功能。 原地摆臂 原地圆形摆动 原地蹲起 原地踏步 2. 电子硬件 本实验中采用了以下硬件&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩展板 Bigf…

pyspark随记

1、spark读取文件 #1.spark 读取csv custid_df spark.read.format("csv").\option("sep", ",").\option("header", True).\option("encoding", "utf-8").\schema("custid STRING").\load("/tmp/…

SQL聚合函数和窗口函数

1.创建表格插入数据 DROP TABLE IF EXISTS 学生; create table 学生 (student_id INT PRIMARY KEY,gender TEXT,city TEXT,a_score FLOAT(2),b_score FLOAT(2),weight FLOAT(2) )engineinnodb;INSERT INTO 学生 VALUES (001,female,xiameng,90.6,110.87,50.34), (002,male,gua…

应用程序发生异常,6个方法轻松解决!

“用电脑的时候大家有没有遇到过应用程序异常的情况呀&#xff01;刚刚突然遇到这种情况不知道应该怎么解决&#xff0c;请大家帮帮我吧&#xff01;” 应用程序发生异常是在使用电脑时常见的问题之一。当应用程序无法正常运行或突然崩溃时&#xff0c;它会显示一个错误消息或弹…

港联证券-尾盘集合竞价拉升意味着什么意思?

在股票市场中&#xff0c;尾盘集合竞价是指每个交易日的最后几分钟&#xff0c;即下午14:57到3:00之间的交易。在这段时间内&#xff0c;所有股票的买卖都将以竞价的方式进行&#xff0c;最终价格以最高买价与最低卖价的平均值确定&#xff0c;成交量也将作为当日的收盘价和成交…

Qt音视频开发47-文字和图片水印(可存储到MP4中)

一、前言 近期花了两周时间闭门啃硬骨头&#xff0c;主要就解决三个问题&#xff08;音视频同步存储和推流、图片水印并将水印信息存储到文件或者推流、rtsp推流&#xff09;&#xff0c;这三个问题困扰了很多年&#xff0c;以至于找遍了网络和翻遍ffplay代码以及ffmpeg示例的…

【ceph】存储池pg个数如何设置

存储池pg个数如何设置 参考官方文档说明&#xff1a;https://old.ceph.com/pgcalc/参数说明TargePGs per OSD&#xff1a;每个OSD的pg数OSD#存储池包含osd个数%Data存储池写入数据占总OSD容量百分比Size存储池冗余数

Selenium 报表自动化测试——黑盒测试篇

目录 前言&#xff1a; 背景 需求 分析 解决思路 解决方案 测试流程图 实现的功能 用例代码 两种测试方式 随机测试 指定测试 总结 前言&#xff1a; Selenium是一个广泛使用的自动化测试工具&#xff0c;用于Web应用程序的测试。它提供了一组功能强大的API&…

【CCF推荐】1区TOP刊,稳定检索29年,仅17天见刊,7月26即将截稿~

本期小编给大家推荐的是一本1区计算机科学类SCI. 该期刊为CCF推荐TOP刊&#xff0c;是计算机科学领域高质量期刊&#xff0c;隶属于世界前三出版社旗下。 发表与数字孪生、物联网、服务计算、智能计算、大数据、云计算、网络服务等方向相关或结合研究的高质量原创文章。 在…

关于SpringMVC的面试题

一、SpringMVC执行流程知道吗&#xff1f; 前后端分离开发环境下&#xff08;接口开发、异步请求&#xff09;&#xff1a; ①用户端发送请求到前端控制器DispatcherServlet ②DispatcherServlet收到请求调用HandlerMapping ③HandlerMapping找到具体的处理器&#xff0c;生…

itheima苍穹外卖项目学习笔记--Day8: 用户下单 / 微信支付

Day8&#xff1a;用户下单、微信支付 Day8&#xff1a;用户下单、微信支付a. 用户下单b. 微信支付 Day8&#xff1a;用户下单、微信支付 a. 用户下单 创建OrderController并提供用户下单方法&#xff1a; /*** 用户下单* param ordersSubmitDTO* return*/ PostMapping("…

数字信号转模拟信号PWM脉宽调制信号输入隔离变送器1Hz~10KHz转0-5V/0-10V4-20mA

主要特性: >>精度等级&#xff1a;0.1级。产品出厂前已检验校正&#xff0c;用户可以直接使用 >>辅助电源&#xff1a;8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号&#xff1a;0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…

基于ClickHouse解决活动海量数据问题 | 京东云技术团队

1、背景 魔笛活动平台要记录每个活动的用户行为数据&#xff0c;帮助客服、运营、产品、研发等快速处理客诉、解决线上问题并进行相关数据分析和报警。可以预见到需要存储和分析海量数据&#xff0c;预估至少几十亿甚至上百亿的数据量&#xff0c;所以需要选择一款能存储海量数…

Linux 6.5 内核提供对 USB4 v2 的初步支持

导读最新内核补丁显示&#xff0c;英特尔正在为 Linux 6.5 内核提供对 USB4 v2 的初步支持&#xff0c;并在其新的英特尔 Barlow Ridge 离散控制器上进行初步启用。 去年&#xff0c;USB4 v2.0 规范作为 USB4 标准的下一代版本发布。 USB4 v2 可通过 USB Type-C 线支持 80 Gbp…

配电室智能运维功能性如何?

很多物业单位在配电室运维上&#xff0c;现状普遍是人少、事多、责任大。有时电工需要同时负责多个高低压配电室值班和设备维修&#xff0c;现有人员平时忙于应付各种设备设施的报修处理&#xff0c;配电室巡检和维护工作常常流于形式。另外&#xff0c;电力运行维护专业性很强…

SAP BOM中的技术类型简介

本文介绍一下BOM中技术类型 1、简单BOM 2、派生BOM 3、多重BOM 由于BOM的技术类型系统会自动设置所以大家基本感觉不到它的存在。基本上很少有同学会关注这个地方。 我们先从简单BOM开始&#xff0c;基本每个项目实施都会用到&#xff0c;就是一个物料具有多个组件清单 这种情…