协程的意义(二)

news2024/11/21 2:32:09

1.协程的意义

在一个线程中,如果遇到IO等待,线程不会一直在等待,而是利用空余时间去完成别的任务(充分利用线程)。

示例:下载图片

①普通的方式下载图片(同步方式)

②使用协程的方式下载图片(异步方式,也可通过线程池、进程池完成,可称为异步编程)

2.基于协程方式的异步编程

2.1 事件循环

可以理解为一个死循环,去检查并执行某些代码。io等待被认为是不可执行的任务,如果碰到不可执行的任务,会将它放置在哪里,去执行下一个可执行任务。如果io请求执行完,该任务就变成可执行任务。

代码实现:

2.2 快速上手

协程函数:定义   函数时     async def 函数名;

协程对象:执行   协程函数()   得到协程对象。

!!!当一个           协程函数()只是得到了一个协程对象,他的内部函数是不会执行的。

只有当协程函数、协程对象和事件循环搭配使用,才能执行协程函数内部代码(需要将协程对象交给事件循环进行处理)。

python3.7后有更简单的写法:

2.3 await关键字

await    后一般跟    可等待对象 (协程对象,Future, Task对象-->io等待)等这个io(等待的这个过程中会切换到其他任务),当io结束后才会去执行

示例一:

示例二:

示例三:

一个协程函数中可以有多个await,遇到await后可以切换到其他协程函数中,但是不会顺序执行等待函数所在代码!!!(await就是等待对象的值得到结果之后,再去继续向下走)

2.4 Task对象

在事件循环中可以并发的添加多个任务。

Task是用于并发调度协程,通过asyncio.create_task(协程对象)的方式创建Task对象,可以让协程函数加入事件循环中等待被调度执行。处理使用asyncio.create_task(协程对象)函数以外,还可以使用低层级的loop.create_task()或ensure_future()函数,不建议手动实例化Task对象。

asyncio.create_task(协程对象)在python3.7后才被引入,在python3.7之前可以使用低级的asyncio.ensure_future()函数。

以上将Task任务放到事件循环中,不是常用的方法。(在执行main代码时,事件循环已经创建,在asyncio.run()执行时)

示例:(这种方法使用场景较少)

Task对象的作用:可以将某个任务立即加入到事件循环中,并发的创建多个任务。

2.5 asyncio的.Future对象

       一般不会直接使用,是Task的基类。Future内部封装了_state值,他维护await等待的 状态,如果它已经完成,await就不会再这等待,可以继续往下走。

示例一:

Future对象什么都没有做,所以他没有结果会一直等待下去。

示例二:

2.6 concurrent.futures.Future对象

使用线程池、进程池实现异步操作时用到的对象。

pool.submit()让你的线程池,拿一个线程,执行函数(往线程池提交任务申请)。

写代码的过程中,可能会存在交叉使用的情况。一般情况下协程和线程、进程池不会交叉使用。但是某个项目80%都是基于协程异步编程+MysQL(不支持,得将两种future结合,用线程和进程做异步编程)

 参考视频:03 协程意义_哔哩哔哩_bilibili

04 asyncio事件循环_哔哩哔哩_bilibili

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

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

相关文章

发泡机液压站比例阀放大器

发泡机液压站是提供动力和压力以驱动发泡机工作的系统。 发泡机是一种用于制备聚氨酯发泡材料的设备,而液压站则扮演着为发泡机提供必要动力的角色。具体来看,液压站的主要组成包括: 液压油箱:存储液压油,为系统提供液…

【Applied Algebra】隐藏子群问题和Shor算法的新视角

隐藏子群问题和Shor算法的新视角 隐藏子群问题是指给定一个群和一个函数,该函数对于群的一个子群是常数,并且对于子群的任何两个不同的左陪集有不同的值,问题是找到这个子群.HSP是许多量子算法的基础,其中最著名的是Shor的算法,它可以用来分解大整数和计算离散对数,这直接威胁到…

小目标检测——鸟类数据集

引言 亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 …

nvidia-smi CUDA Version:N/A

问题 nvidia-smi显示:CUDA Version:N/A nvidia-smi -a显示:CUDA Version: Not Found 解决方法 查看Nvidia驱动版本 nvidia-smi如下图,版本为530.41.03 搜索cuda库 apt search libcuda注:不同的源,同一个库的命…

轻量级SQLite可视化工具Sqliteviz

什么是 Sqliteviz ? Sqliteviz 是一个单页面离线优先的渐进式网络应用(PWA),用于完全客户端的 SQLite 数据库或 CSV 文件的可视化。 所谓完全客户端,就是您的数据库永远不会离开您的计算机。使用 sqliteviz&#xff0c…

PyQt程序:实现新版本的自动更新检测及下载(FTP服务器实现)

一、实现逻辑 本实例采用相对简单的逻辑实现,用户在客户端使用软件时点击“检测升级”按钮,连接至FTP服务器检索是否有新版本的.exe,如果有,下载最新的.exe安装升级。 本实例服务端待下载.exe所在目录结构 本实例客户端待更新.exe所在目录结构 二、搭建服务器 可以参考…

IMUGNSS的误差状态卡尔曼滤波器(ESKF)的数学模型

IMU&GNSS的误差状态卡尔曼滤波器(ESKF)的数学模型 把IMU视为运动模型,把GNSS观测视为观测模型,推导整个滤波器 设状态变量为 x [ p , v , R , b g , b a , g ] T x[p,v,R,b_{g},b_{a},g]^{T} x[p,v,R,bg​,ba​,g]T 所有变…

泛型的初步认识(2)

前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&#x…

【深度学习实战(11)】搭建自己的dataset和dataloader

一、dataset和dataloader要点说明 在我们搭建自己的网络时,往往需要定义自己的dataset和dataloader,将图像和标签数据送入模型。 (1)在我们定义dataset时,需要继承torch.utils.data.dataset,再重写三个方法…

LeetCode in Python 55. Jump Game (跳跃游戏)

跳跃游戏的游戏规则比较简单,若单纯枚举所有的跳法以判断是否能到达最后一个下标需要的时间复杂度为O(),为此,本文采用贪心策略,从最后一个下标开始逆着向前走,若能跳到第一个元素则表明可以完成跳跃游戏,反…

Python基础学习之数据切片

数据切片介绍: 切片的基本语法是data[start:stop:step],其中: start 是切片开始的索引(包括该索引处的元素)。 stop 是切片结束的索引(不包括该索引处的元素)。 step 是切片的步长&#xff0…

Go小技巧易错点100例(十五)

本期看点: 正文开始: Go程序跟踪函数的执行时间 在Go程序中我们经常会对接口执行的耗时做一个记录,特别是针对核心或复杂业务的时候,我们需要关注该业务的执行耗时,可以具体到某个方法,有一个简单有效的技…

Linux:常用软件、工具和周边知识介绍

上次也是结束了权限相关的知识:Linux:权限相关知识详解 文章目录 1.yum-管理软件包的工具1.1基本介绍1.2yum的使用1.3yum的周边生态1.4软件包介绍 2.vim-多模式的文本编辑器2.1基本介绍2.2基本模式介绍2.2.1命令模式(Normal mode)…

Python数据可视化库—Bokeh与Altair指南

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在数据科学和数据分析领域,数据可视化是一种强大的工具,可以帮助我们…

循序渐进丨使用 Python 向 MogDB 数据库批量操作数据的方法

当我们有时候需要向数据库里批量插入数据,或者批量导出数据时,除了使用传统的gsql copy命令,也可以通过Python的驱动psycopg2进行批量操作。本文介绍了使用psycopg2里的executemany、copy_from、copy_to、copy_expert等方式来批量操作 MogDB …

Darknet框架优化介绍

一、DarkNet框架简介 1.DarkNet的简介 Darknet是一个完全使用C语言编写的人工智能框架,可以使用CUDA的开源框架。主要应用于图像识别领域。 它具有可移植性好,安装间接,查看源码方便等优势,提供了OpenCV等附加选项,还…

【SpringBoot实战篇】获取用户详细信息-ThreadLocal优化

1 分析问题 对token的解析当初在拦截器中已经写过。期待的是在拦截器里写了,在其他地方就不写了,应该去复用拦截器里面得到的结果 2 解决方式-ThreadLocal 2.1提供线程局部变量 用来存取数据: set()/get()使用ThreadLocal存储的数据, 线程安全 2.2过程图…

Java如何用EasyExcel插件对Excel进行数据导入和数据导出

文章目录 一、EasyExcel的示例导入依赖创建实体类数据导入和导出 二、EasyExcel的作用三、EasyExcel的注解 EasyExcel是一个阿里巴巴开源的excel处理框架,它以使用简单、节省内存著称。在解析Excel时,EasyExcel没有将文件数据一次性全部加载到内存中&…

java-springmvc 01

MVC就是和Tomcat有关。 01.MVC启动的第一步,启动Tomcat 02.Tomcat会解析web-inf的web.xml文件

【Flutter】自动生成图片资源索引插件二:FlutterAssetsGenerator

介绍 FlutterAssetsGenerator 插件 :没乱码,生成的图片索引命名是小驼峰 目录 介绍一、安装二、使用 一、安装 1.安装FlutterAssetsGenerator 插件 生成的资源索引类可以修改名字,我这里改成R 2. 根目录下创建assets/images 3. 点击image…