Python异步编程小解一

news2024/11/15 19:58:43

Python异步编程

什么是异步,为什么是异步?

异步,意指你不用等到某个条件达成再去做某事,比如:你不用等到一切都准备好了才开始跳槽🐕.那么在 多线程 存在的情况下,我们为什么还要把目光投向 异步呢?假如我们使用 threading或者 _thread 编写多线程代码,实际上我们还要承受 CPU 切换线程的代价,因为 单线程的缘故.此外我们在使用多线程的时候,还会面临资源的竞争线程池充分利用……诸如此类的问题.
在这里插入图片描述

什么是Python异步编程

  1. 从Python3.5开始,python3开始支持异步编程.
  2. 在python中我们会用到asyncio包来进行异步编程.
  3. asyncio这个报名可以得知,在python中我们进行异步编程时,我们是围绕IO网络性能进行,而不是CPU操作.
  4. 体验地道、现代的python异步编程,我建议python版本应该>=python3.10
  5. 我们主要使用异步生成的方式来进行异步编程,即async def,在方法里面使用 yield 的生成器函数。返回一个提供__anext__ 方法(获取下一项)的异步生成器对象。

为什么是Python3.10

主要是因为从3.10版本开始,python3.7中的asyncio.get_event_loop已被弃用,最终变成了3.10版本asyncio.get_running_loop,直接一步到位,免去升级烦恼。

开始异步编程第一步

引入 asyncio

import asyncio
认识关键字
1. async
async def 定义一个协程函数
2. await
await exp await 表达式不阻塞
3. 简单示例 1
import asyncio


async def foo(name: str):
    print(f"foo is {name}")


async def hi():
    await foo("one")
    print("It's hi func")

 
if __name__ == '__main__':
    asyncio.run(hi())

------------------------------
foo is one
It's hi func

从上述例子中我们能看到,我们使用async def定义了协程函数,用了await关键字委托另一个原生协程, asyncio.run 启动事件循环,仅当事件循环退出后返回。在使用asyncio 的脚本经常这样做,即把 hi 实现为协程,在 if__name__ == '__main__': 块中使用 asyncio.run 驱动。

4. 简单示例 2
import asyncio
import time


async def foo(n):
    await time_cost()  # wait 5s before continuing
    print(f"n: {n}!")


async def time_cost():
    await asyncio.sleep(5)


async def main():
    start = time.time()
    tasks = [foo(1), foo(2), foo(3)]
    await asyncio.gather(*tasks)
    end = time.time()
    print(end-start)


asyncio.run(main())
----------------------------------------------
n: 1!
n: 2!
n: 3!
5.0098652839660645

从上述例子中我们能看到,我们使用了asyncio.sleep暂停协程的执行一段时间,所以前后差是5S,假如我们在time_cost里面使用time.sleep(5),那么前后差应该是多少?,答案是15S.因为当调用time.sleep(5)时,它会阻塞整个脚本的执行,使其暂停,什么也不做。但是当你调用await asyncio.sleep(5)时,它会请求事件循环运行其他任务,同时等待语句完成执行。此外我们还使用了asyncio.gather:来获取一系列 awaitables,返回成功等待的值的聚合列表。

5. 简单示例 3
import asyncio
import time


async def foo(n):
    await time_cost()  # wait 5s before continuing
    print(f"n: {n}!")
    return n


async def time_cost():
    await asyncio.sleep(5)


async def main():
    start = time.time()
    tasks = [foo(1), foo(2), foo(3)]
    for coro in asyncio.as_completed(tasks):
        num = await coro
        print(num)
    end = time.time()
    print(end-start)


if __name__ == '__main__':
    asyncio.run(main())

--------------------------------------------
n: 1!
n: 3!
n: 2!
1
3
2
5.009920835494995

在上述例子中,asyncio.as_completed是一个生成器,负责产出协程,按照传入的协程完成的顺序(不是协程的提交顺序)返回结果,所以我们看到结果是1、3、2而不是1、2、3。as_completed还有一个作用就是告诉我们,协程已经结束咧。因此我们在用await获取结果的时候是不阻塞的。

第一篇完结,只是简单介绍一下python异步,异步编程大概后面还能写个三~四篇的样子,希望不会鸽🕊.

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

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

相关文章

Kafka - 3.x 文件存储不完全指北

文章目录 Topic数据的存储机制演示基本信息使用kafka-run-class.sh查看index内容使用kafka-run-class.sh查看log内容 index文件和log文件详解日志存储参数配置文件清理策略综述清理策略1)delete策略2)compact日志策略 高效读写的原因 Topic数据的存储机制…

Glide原理

本文基于Carson整理 1.简介 相比其他几种图片加载框架,Glide性能最好。这得益于其高效的图片缓存策略 其还有多样化的媒体格式加载:如GIF、Video,对于商城首页需展示丰富样式、信息的页面需求来说,也是必不可少的。 2.加载原理…

【数智化人物展】洞隐科技联合创始人兼CEO董志刚:数智化转型的核心是应用新技术打造新型的文化、组织和商业模式...

董志刚 本文由洞隐科技联合创始人兼CEO董志刚投递并参与《2023中国企业数智化转型升级先锋人物》榜单/奖项评选。 数据智能产业创新服务媒体 ——聚焦数智 改变商业 在数字化日益渗透的今天,“释放数字价值,驱动智能转型”已逐渐成为企业转型与创新的关…

Vue插件的使用

一、插件的定义 (一)创建plugin.js文件 文件名可以自定义,但是行业内默认使用plugin作为文件名,该文件和main.js是平级的。 (二)编写对象中的install方法 install方法能够接收一个参数,就是…

【go】两数求和

文章目录 题目代码解法2 代码仓库 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案…

5款在线JavaScript加密混淆工具

5款常用、好用的在线JavaScript加密混淆工具,网址请从截图中查看。 1、jscrambler 2、JShaman 3、javascriptobfuscator 4、freejsobfuscator 5、jjencode

【PyQt】调整子控件的层级以调整绘制的先后顺序

简述 qt中貌似没有直接设置z序的函数,但对应的有其他调整z序的方法: QWidget.raise_():置顶 QWidget.lower():置底 QWidget.stackUnder(wid):置于指定控件之下 其中关键函数是QWidget.stackUnder(wid),利…

phpstorm2022.3.3和xdebug 3 调试代码记录

有鉴于之前使用log日志调试代码,或者var_dump()调试代码太慢了,系统出了问题排查效率低下。最终决定使用xdebug工具提高效率。总结如下: 1. xdebug版本要和phpstorm兼容, 这里使用xdeubug 3.1.6,phpstorm 2022.3.3 (破…

nvm的安装和使用

nvm用途 nvm是用来管理node版本的,安装成功之后可以去切换自己的node版本,就不需要通过安装卸载不同版本的node包 下载与安装 下载地址是https://github.com/coreybutler/nvm-windows/releases 下载nvm-setup.zip,然后安装就可以了 默认路径是C:\Users\wangjingtao\AppData\…

实现成绩发布的高效与便捷

老师们想不想告别繁琐的手动操作,简单省心的发布和查询考试成绩?今天分享的这个方法,可以让学生和家长自主查询成绩,是不是感觉超级方便呢?我来给各位老师讲解一下什么是成绩查询系统吧! 成绩查询系统 成绩…

Reflect 对象的创建目的

目录 前言 逻辑 代码示例 使用 Reflect 操作属性 使用 Reflect 检查属性是否存在 使用 Reflect 创建代理 用法 结论 参考资料 前言 Reflect是JavaScript中的一个内置对象,它提供了一组用于访问对象属性和执行对象方法的方法。Reflect的设计目的是为了在语…

IDEA部署SSM项目mysql数据库MAVEN项目部署教程

如果 SSM 项目是基于 Maven 构建的,则需要配置 maven 环境,否则跳过这一步 步骤一:配置 Maven 第一步:用 IDEA 打开项目,准备配置 maven 环境 ,当然如果本地没有提前配置好 maven,就用 IDEA 默…

多线程面试相关知识点

文章目录 (一) 进程线程和协程的区别创建线程的4种方式1. 继承Thread类2. 实现runnable接口3. 实现Callable接口4. 线程池创建 runnable 和 callable 有什么区别线程的 run()和 start()有什么区别?线程之间的状态变化notify()和 notifyAll()有什么区别?j…

C++之lambda匿名、using、typedef总【全】(二百四十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

如何选择最适合 Android 的 SD 卡恢复软件?

所需要的只是心不在焉地点击了错误的按钮、行为不当的应用程序、或者软件或硬件故障。就这样,您的照片消失了,您的笔记无处可寻,您的文件也消失了。 如何选择最适合 Android 的 SD 卡恢复软件 对别人最好的可能对你不起作用,这取…

【Unity小技巧】可靠的相机抖动及如何同时处理多个震动

每篇一句 围在城里的人想逃出来,站在城外的人想冲进去,婚姻也罢,事业也罢,人生的欲望大都如此。——钱钟书《围城》 前言 相机的抖动我相信大家都不陌生,网上其实已经有非常非常多的教程了,之前我也写过…

2.21每日一题(隐函数求导+变上限积分求导)

1、首先 t 0 时,x ? 或者 y ? 求出来 2、等式两边进行一阶求导,把一阶导函数(隐函数求导)求出来 3、等式两边再次求导,把二阶导函数(隐函数求导)求出来 注意:隐函数求导及变上…

Java 枚举类型与泛型-第13章

Java 枚举类型与泛型-第13章 1.枚举类型 枚举类型是一种特殊的数据类型,用于表示一组有限的命名常量。枚举类型可以帮助您更清晰地定义和管理相关常量,并提供类型安全性。 1.1使用枚举类型设置常量 枚举类型是一种非常方便的方式来设置常量。我们可以…

YUV空间-两张图片颜色匹配(颜色替换)

在做颜色匹配时,从RGB转换到YUV也有一些优势。因为YUV把亮度和色彩分开了,所以可以更容易地调整图像的亮度分布和色彩平衡⁴。而且,YUV也更接近人类感知颜色的方式,所以可以更好地保持图像的自然感。 这个公式是用来做颜色匹配的&…

Node.js 的适用场景

目录 ​编辑 前言 适用场景 1. 实时应用 用法 代码 理解 2. API 服务器 用法 代码示例 理解 3. 微服务架构 用法 代码示例 理解 总结 前言 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它使得 JavaScript 可以脱离浏览器运行在服务器…