一文读懂Asyncio

什么是Asyncio

        asyncio 是用来编写并发代码的库,使用async/await语法。

        asyncio 被用作多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。

        asyncio 往往是构建 IO 密集型和高层级结构化网络代码的最佳选择。

线程和协程

        协程是一种比线程更加轻量级的存在

        线程:把需要执行的任务比作汽车,线程就像一条单行且只有一条道的高速公路,只有等前一辆车到达终点后面的车才能出发,如果其中一辆出了事情停在了路上,那么这俩车后面的车就只能原地等待直到它恢复并到达终点才能继续上路。

        协程:把需要执行的任务比作汽车,协程就像一条带应急车道的高速公路,如果汽车在中途出了问题就可以直接到一边的应急车道停下处理问题,下一辆车可以直接上路,简单来说就是可以通过程序控制哪辆车行驶,哪辆车在应急车道休息。

同步和异步

同步:意味着有序
异步:意味着无序

同步必须一件事情结束之后再进行下一件事,异步是可以在一件事情没结束就去处理另外一件事情了。

定义协程函数

# work()函数就是一个协程
async def work(x):peint(x)await asyncio.sleep(x)# 验证协程函数
print(asyncio.iscoroutine(work(1)))

协程对象

协程函数() 得到的对象 

注意: res = work()创建协程对象,函数内部代码不会执行。如果要运行协程函数内部代码,必须要将协程对象交给事件循环来处理。 

# work()函数就是一个协程
async def work(x):peint(x)await asyncio.sleep(x)res = work()loop = asyncio.get_event_loop()loop.run_until_complete(res) 

运行协程函数

调用协程函数,协程并不会开始运行,只是返回一个协程对象,可以通过 asyncio.iscoroutine 来验证:

print(asyncio.iscoroutine(work(3)))

# 去生成或获取一个事件循环
loop = asyncio.get_event_loop()
# run_until_complete 的参数是一个 future,但是我们这里传给它的却是协程对象
loop.run_until_complete(asyncio.ensure_future(do_some_work(3)))

多个协程

实际项目中,往往有多个协程,同时在一个 loop 里运行。为了把多个协程交给 loop,需要借助 asyncio.gather 函数。

loop.run_until_complete(asyncio.gather(work(1), work(3)))
# 这两个协程是并发运行的,所以等待的时间不是 1 + 3 = 4 秒,而是以耗时较长的那个协程为准
# gather 起聚合的作用,把多个 futures 包装成单个 future,因为 loop.run_until_complete 只接受单个 future。

await关键字

        await后跟可等待对象,可等待对象包括协程对象、Future和Task对象,这些都是IO等待。等IO操作完成之后再继续往下执行,当前协程(任务)挂起时,事件循环可以执行其他协程(任务)。

        同一个协程任务中,多个await,会依次等待等待对象执行完成;不同协程任务中,遇到await会交替执行。 

案例1:

import asyncioasync def func1():print(1)await asyncio.sleep(2)print(2)return "func1"async def test1():print("执行协程函数test1内部代码")res = await func1()print("IO请求结束test1,结果为: ", res)res = await func1()print("IO请求结束test1,结果为: ", res)tasks = [asyncio.ensure_future(test1())
]loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

案例2

import asyncioasync def func1():print(1)await asyncio.sleep(2)print(2)return "func1"async def func2():print(3)await asyncio.sleep(2)print(4)return "func2"async def test1():print("执行协程函数test1内部代码")res = await func1()print("IO请求结束test1,结果为: ", res)async def test2():print("执行协程函数test2内部代码")res = await func2()print("IO请求结束test2,结果为: ", res)tasks = [asyncio.ensure_future(test1()),asyncio.ensure_future(test2())
]loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

task对象

Task被用来在事件循环中添加多个任务的。

当协程包装到具有asyncio.create_task()等函数的任务中时,会自动地添加到事件循环中等待被调度执行。除了使用asynico.create_task()函数以外,还可以用底层级的loop.create_create_task()或ensure_future()函数。 

案例1

import asyncioasync def func1(n):print(n)await asyncio.sleep(2)print(n)return f"func{n}"async def main():print('开始')# 自动加入到事件循环里task1 = asyncio.create_task(func1(1))# 自动加入到事件循环里task2 = asyncio.create_task(func1(2))print('结束')res1 = await task1res2 = await task2print(res1, res2)asyncio.run(main()) 

案例2

import asyncioasync def func1():print(1)await asyncio.sleep(2)print(2)return "func1"async def main():print('开始')task_list = [# 自动加入到事件循环里asyncio.create_task(func1(), name='task1'),# 自动加入到事件循环里asyncio.create_task(func1(), name='task2')]print('结束')done, pending = await asyncio.wait(task_list, timeout=None)print(done)asyncio.run(main()) 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙应用开发-初见:入门知识、应用模型

基础知识 Stage模型应用程序包结构 开发并打包完成后的App的程序包结构如图 开发者通过DevEco Studio把应用程序编译为一个或者多个.hap后缀的文件,即HAP一个应用中的.hap文件合在一起称为一个Bundle,bundleName是应用的唯一标识 需要特别说明的是&…

视频字幕处理+AI绘画,Runway 全功能超详细使用教程(4)

runway的视频字幕处理、AI绘图功能介绍,感觉完全就是为了做电影而布局,一整套功能都上线了!想系统学习的必收藏! 在深度研究Runway各个功能后,无论是AI视频生成及后期处理技术,还是AI图像生成技术&#xff…

大厂前沿技术导航

个人看到的,比较好的一些大厂的博客。他们都在积极的更新。在这些地方,总能看到他们最新的动态。这些都是大厂的官方博客,文章的质量都是相对比较高的。水文,肯定不会随便发出来,不然肯定打了自己公司的脸了。腾讯和美…

onlyoffice文件大小超出了服务器设置处理

onlyoffice文件大小超出了服务器设置处理 1.前言2. onlyoffice服务安装2.1 docker安装命令2.2 访问测试 3. 修改服务器文件大小限制方案3.1 旧方案-7.2版本不可行3.1.1 进入 OnlyOffice Document Server 容器3.1.2 编辑配置文件3.1.3 找到并修改文件大小限制3.1.4 保存并退出编…

【开源】基于JAVA的天然气工程业务管理系统

项目编号: S 021 ,文末获取源码。 \color{red}{项目编号:S021,文末获取源码。} 项目编号:S021,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四…

CSDN助手:一键下载CSDN博客:高效保存,随时阅读

文章目录 📖 介绍 📖🏡 环境 🏡📒 使用方法 📒⚓️ 相关链接 ⚓️ 📖 介绍 📖 这是我自己无聊的时候写的一个应用,以前UI有点丑,这次重写了一下UI 功能如下 …

Redis-主从与哨兵架构

Jedis使用 Jedis连接代码示例&#xff1a; 1、引入依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version> </dependency> 2、访问代码 public class JedisSingleTe…

【SpringCloud】微服务架构设计模式

一、聚合气微服务设计模式 最常见、最简单的设计模式&#xff0c;效果如图所示&#xff1a; 聚合器调用多个服务实现应用程序所需的功能 它可以是一个简单的 Web 页面&#xff0c;将检索到的数据进行处理并展示&#xff0c;也可以是一个更高层次的组合微服务&#xff0c;对…

【数据结构/C++】栈和队列_循环队列

牺牲一个存储单元来判断队满。 #include<iostream> using namespace std; // 循环队列 #define MaxSize 10 typedef int ElemType; typedef struct {ElemType data[MaxSize];int front, rear; } SqQueue; // 初始化队列 void InitQueue(SqQueue &Q) {// 判断队空 Q.…

注解(概念、分类、自定义注解)

注解基本概念 注解(元数据)为我们在代码中添加信息提供一种形式化的方法&#xff0c;我们可以在某个时刻非常方便的使用这些数据。将的通俗一点&#xff0c;就是为这个方法增加的说明或功能。 作用&#xff1a; 编写文档&#xff1a;通过代码里标识的注解生成文档【生成doc文…

Git和Git小乌龟安装

目录 Git简介 Git安装 Git小乌龟简介 Git小乌龟安装 Git简介 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地进行从很小到非常大的项目的版本管理。它最初是由Linux Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git具有速度、…

网络安全 | 使用人工智能阻止网络攻击

全球范围内分布式拒绝服务 (DDoS) 网络攻击急剧增加&#xff0c;这种数字攻击可以通过大量的互联网流量压垮目标服务器&#xff0c;从而使网站瘫痪。这种攻击每年都会发生数百万起&#xff0c;而且数量和规模都在不断增加。大约三分之一的网站宕机是由于 DDoS 攻击所致。 计算…

异步爬虫提速实践-在Scrapy中使用Aiohttp/Trio

在构建爬虫系统时&#xff0c;提高爬虫速度是一个关键问题。而使用异步爬虫技术可以显著提升爬取效率。在本文中&#xff0c;我将与大家分享如何在Scrapy中利用Aiohttp或Trio库实现异步爬取&#xff0c;以加快爬虫的速度。让我们开始吧&#xff01; 1. 安装所需的库 首先&…

Spring Security 6.x 系列(5)—— Servlet 认证体系结构介绍

一、前言 本章主要学习Spring Security中基于Servlet 的认证体系结构&#xff0c;为后续认证执行流程源码分析打好基础。 二、身份认证机制 Spring Security提供个多种认证方式登录系统&#xff0c;包括&#xff1a; Username and Password&#xff1a;使用用户名/密码 方式…

《golang设计模式》第三部分·行为型模式-06-备忘录模式(Memento)

文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 备忘录&#xff08;Memento&#xff09;用于在不破坏目标对象封装特性的基础上&#xff0c;将目标对象内部的状态存储到外部对象中&#xff0c;以备之后恢复状态时使用。 1.1 角色 Originato…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(七)

分页查询、删除和修改菜品 1. 菜品分页查询1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 设计DTO类1.2.2 设计VO类1.2.3 Controller层1.2.4 Service层接口1.2.5 Service层实现类1.2.6 Mapper层 1.3 功能测试1.3.2 前后端联调测试 2. 删除菜品2.1 需求分析…

可视化大屏时代的到来:智慧城市管理的新思路

随着科技的不断发展&#xff0c;智能芯片作为一种新型的电子元件&#xff0c;被广泛应用于各个领域&#xff0c;其中智慧芯片可视化大屏是一种重要的应用形式。 一、智慧芯片可视化大屏的优势 智慧芯片可视化大屏是一种将智能芯片与大屏幕显示技术相结合的产品&#xff0c;山海…

[pyqt5]pyqt5设置窗口背景图片后上面所有图片都会变成和背景图片一样

pyqt5的控件所有都是集成widget&#xff0c;窗体设置背景图片后控件背景也会跟着改变&#xff0c;此时有2个办法。第一个办法显然我们可以换成其他方式设置窗口背景图片&#xff0c;而不是使用styleSheet样式表&#xff0c;网上有很多其他方法。还有个办法就是仍然用styleSheet…

redis---主从复制及哨兵模式(高可用)

主从复制 主从复制&#xff1a;主从复制是redis实现高可用的基础&#xff0c;哨兵模式和集群都是在主从复制的基础之上实现高可用。 主从负责的工作原理 1、主节点&#xff08;master&#xff09; 从节点&#xff08;slave&#xff09;组成&#xff0c;数据复制是单向的&a…

IP-Adapter:文本兼容图像提示适配器,用于文本到图像扩散模型

IP-Adapter这是一种有效且轻量级的适配器&#xff0c;用于实现预训练文本到图像扩散模型的图像提示功能。只有 22M 参数的 IP 适配器可以实现与微调图像提示模型相当甚至更好的性能。IP-Adapter 不仅可以推广到从同一基本模型微调的其他自定义模型&#xff0c;还可以推广到使用…