当前位置: 首页 > article >正文

【python】协程(coroutine)

协程(coroutine)可以理解为一个可以中途暂停保存当前执行状态信息并可以从此处恢复执行的函数,多个协程共用一个线程执行,适合执行需要“等待”的任务。

所以严格意义上,多个协程同一时刻也只有一个在真正的执行,因为线程是任务调度的基本单位。注意这里的执行指的是占用CPU计算,不包括等待阻塞等场景。

python中实现协程的标准库是asyncio,标准库的实现中大致可以由底层到顶层分为下面几个对象:

  1. coroutine:一个可以暂停和恢复的函数,它允许在执行过程中挂起自身,并在稍后的时间点恢复执行。协程通常通过 async def 定义,python 中当调用一个协程函数时,实际上返回的是一个协程对象,而不是立即执行该函数体中的代码。
  2. task:事件循环中真正调度执行的对象,future的子类,封装了coroutine以及执行的上下文信息。
  3. future:在某种意义上,是一种“未来要执行的任务”的封装,当一个任务被封装成future后,就可以交给事件循环执行。
  4. 事件循环:异步程序的核心机制,负责调度和执行任务。它是一个无限循环,不断从任务队列中获取任务并执行,直到所有任务完成。

coroutine/task/future都是可await获取执行结果的,但await coroutine并不会创建task,会挂起同步等待await的协程执行完再回到当前协程继续执行,而await task/future时,会异步等待task完成。关键点还是在于事件循环中调度执行的是task而不是coroutine。

下面是一些场景的测试:

1)直接await coroutine时,阻塞执行,两个协程各自sleep 1s,共用时2s+

#!/usr/bin/env python3
# -*-coding:utf-8 -*-import os
import asyncio
import threading
from datetime import datetimeasync def fun(num1, num2):await asyncio.sleep(1)print(f'pid:{os.getpid()} | tid:{threading.current_thread().name} | num1:{num1} | num2:{num2} | time:{datetime.now()}')return num2 - num1async def main():start_time = datetime.now()print(f'main start: {start_time}')res1 = await fun(1, 2)res2 = await fun(10, 20)end_time = datetime.now()print(f'main end: {end_time}')print(f"res1:{res1} | res2:{res2} | cost: {(end_time - start_time).microseconds}ms")if __name__ == '__main__':asyncio.run(main())

在这里插入图片描述


2)await task时,非阻塞执行,两个task各自sleep 1s,共用时1s+

#!/usr/bin/env python3
# -*-coding:utf-8 -*-import os
import asyncio
import threading
from datetime import datetimeasync def fun(num1, num2):await asyncio.sleep(1)print(f'pid:{os.getpid()} | tid:{threading.current_thread().name} | num1:{num1} | num2:{num2} | time:{datetime.now()}')return num2 - num1async def main():start_time = datetime.now()print(f'main start: {start_time}')task1 = asyncio.create_task(fun(1, 2))task2 = asyncio.create_task(fun(10, 20))res1 = await task1res2 = await task2end_time = datetime.now()print(f'main end: {end_time}')print(f"res1:{res1} | res2:{res2} | cost: {(end_time - start_time).microseconds}ms")if __name__ == '__main__':asyncio.run(main())

在这里插入图片描述


3)await future,非阻塞执行,三个协程各自sleep 1s,共用时1s+

gather中传递协程对象时会隐式转为task。

#!/usr/bin/env python3
# -*-coding:utf-8 -*-import os
import asyncio
import threading
from datetime import datetimeasync def fun(num1, num2):await asyncio.sleep(1)print(f'pid:{os.getpid()} | tid:{threading.current_thread().name} | num1:{num1} | num2:{num2} | time:{datetime.now()}')return num2 - num1async def main():start_time = datetime.now()print(f'main start: {start_time}')futures = asyncio.gather(fun(1, 2), fun(10, 20))res = await asyncio.gather(futures, fun(100, 200))end_time = datetime.now()print(f'main end: {end_time}')print(f"res:{res} | cost: {(end_time - start_time).microseconds}ms")if __name__ == '__main__':asyncio.run(main())

在这里插入图片描述

相关文章:

【python】协程(coroutine)

协程(coroutine)可以理解为一个可以中途暂停保存当前执行状态信息并可以从此处恢复执行的函数,多个协程共用一个线程执行,适合执行需要“等待”的任务。 所以严格意义上,多个协程同一时刻也只有一个在真正的执行&#…...

【编译器】-LLVMIR

概述 LLVM 是一种基于静态单赋值 (SSA) 的表示形式,提供类型安全、低级操作、灵活性以及干净地表示“所有”高级语言的能力。 LLVM IR 是一门低级语言,语法类似于汇编任何高级编程语言(如C)都可以用LLVM IR表示基于LLVM IR可以很…...

java面试场景问题

还在补充,这几天工作忙,闲了会把答案附上去,也欢迎各位大佬评论区讨论 1.不用分布式锁如何防重复提交 方法 1:基于唯一请求 ID(幂等 Token) 思路:前端生成 一个唯一的 requestId(…...

算法菜鸡备战3月2日传智杯省赛----0221

2209. 用地毯覆盖后的最少白色砖块 - 力扣(LeetCode) 力扣每日一题 class Solution { public:// 白色最少 黑色最多int minimumWhiteTiles(string floor, int numCarpets, int carpetLen) {int n floor.size();// 记忆化搜索vector memo(n 1, vector&…...

python pandas下载

pandas pandas:就是一个可以处理数据的 python 库 核心功能: 数据的清洗:处理丢失值,重复值数据分析:计算和统计信息,或分组汇总数据可视化:结合 图标库(Matplotlib)完成数据可视化…...

高斯牛顿法(GN)与列文伯格-马夸尔特方法在ORB-SLAM3中的应用

问题背景 高斯牛顿法(Gauss-Newton, GN)和列文伯格-马夸尔特方法(Levenburg-Marquadt, LM)是两种最常用的非线性优化方法,这两种方法在ORB-SLAM3系统中均有使用。 在ORB-SLAM3前端跟踪线程(Tracking)中,局…...

Python+Selenium+Pytest+POM自动化测试框架封装

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、测试框架简介 1)测试框架的优点 代码复用率高,如果不使用框架的话,代码会显得很冗余。可以组装日志、报告、邮件等一些高…...

猿大师中间件:网页直接内嵌本机EXE、OCX控件、ActiveX控件或桌面应用程序神器

猿大师中间件自从2019年发布以来,迄今为止不断迭代升级,给第三方提供了将自己的桌面程序和OCX控件支持直接内嵌到浏览器网页运行的赋能SDK开发包。 目前针对不同需求发布了三个成熟且商用的产品: 猿大师播放器:浏览器中直接原生…...

【Python】03-Python语法入门

文章目录 1、基本概念1.1、表达式1.2、语句1.3、程序(program)1.4、函数(function) 2、基本语法3、字面量与变量4、变量与标识符 1、基本概念 1.1、表达式 表达式就是一个类似于数学公式的东西,表达式一般仅用来计算一…...

C++,设计模式,【工厂方法模式】

文章目录 如何用汽车生产线理解工厂方法模式?一、传统生产方式的困境二、工厂方法模式解决方案三、模式应用场景四、模式优势分析五、现实应用启示✅C++,设计模式,【目录篇】 如何用汽车生产线理解工厂方法模式? 某个早晨,某车企CEO看着会议室里堆积如面的新车订单皱起眉…...

跟着 Lua 5.1 官方参考文档学习 Lua (5)

文章目录 2.10 – Garbage Collection2.10.1 – Garbage-Collection Metamethods2.10.2 – Weak Tables 2.10 – Garbage Collection Lua performs automatic memory management. This means that you have to worry neither about allocating memory for new objects nor abo…...

9.PG数据库层权限管理(pg系列课程)第2遍

一、PostgreSQL数据库属主 Postgres中的数据库属主属于创建者,只要有createdb的权限就可以创建数据库,数据库属主不一定拥有存放在该数据库中其它用户创建的对象的访问权限。数据库在创建后,允许public角色连接,即允许任何人连接…...

鸿蒙-canvas-画时钟

文章目录 前言准备分析组成部分数值计算过程 开始第一步 画圆环第二步 画格子第三步 画数字第四、五步 画指针&定时更新最后一步 前言 你在 Android 上能画出来的东西,在鸿蒙上画不出来? 画个时钟嘛,有啥难的? 你行你上&…...

【AI实践】阿里百炼文本对话Agent安卓版搭建

环境:安卓手机运行环境;WinsurfAI编程工具;阿里百炼提前创建Agent应用; 耗时:2小时; 1,新建安卓项目 完成文本输入,并将输入的文字显示出来。 2,安装SDK 参考文档 安…...

算法很美笔记(Java)——动态规划

解重叠子问题(当前解用到了以前求过的解) 形式:记忆型递归或递推(dp) 动态规划本质是递推,核心是找到状态转移的方式,也就是填excel表时的逻辑(填的方式),而…...

Jest单元测试

由于格式和图片解析问题,可前往 阅读原文 前端自动化测试在提高代码质量、减少错误、提高团队协作和加速交付流程方面发挥着重要作用。它是现代软件开发中不可或缺的一部分,可以帮助开发团队构建可靠、高质量的应用程序 单元测试(Unit Testi…...

《Stable Diffusion绘画完全指南:从入门到精通的Prompt设计艺术》-配套代码示例

第一章:模型加载与基础生成 1.1 基础模型加载 from diffusers import StableDiffusionPipeline import torch# 加载SD 1.5基础模型(FP32精度) pipe StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5",…...

OnlyOffice:前端编辑器与后端API实现高效办公

OnlyOffice:前端编辑器与后端API实现高效办公 一、OnlyOffice概述二、前端编辑器:高效、灵活且易用1. 完善的编辑功能2. 实时协作支持3. 自动保存与版本管理4. 高度自定义的界面 三、后端API:管理文档、用户与权限1. 轻松集成与定制2. 实时协…...

springboot多实例部署时,@Scheduled注释的方法重复执行

问题&#xff1a;springboot多实例部署时&#xff0c;Scheduled注释的方法重复执行 在 Spring Boot 中要实现 Redis 的SET NX EX命令&#xff0c;可以借助 Spring Data Redis 来完成。SET NX EX命令用于在键不存在时设置键值对&#xff0c;并同时设置过期时间。 <dependen…...

coco格式

COCO&#xff08;Common Objects in Context&#xff09;格式是一种广泛用于图像识别和分割任务的数据格式&#xff0c;尤其是在目标检测、语义分割等任务中。COCO格式的核心包括以下几个部分&#xff1a; images: 包含图像的基本信息&#xff08;如文件名、大小、ID等&#x…...

骶骨神经

骶骨肿瘤手术后遗症是什么_39健康网_癌症 [健康之路]匠心仁术&#xff08;七&#xff09; 勇闯禁区 骶骨肿瘤切除术...

Nacos学习(二)——继承Feign与Config中心

目录 一、集成Feign (一)基础用法 1.添加openfeign依赖 2. 开启openFeign注解扫描 3.创建ProviderService接口 4.修改ConsumerController (二)OpenFeign日志配置 (三)参数传递 1.参数传递的问题 2.参数传递的方式 2.1URL路径传参 2.2URL上拼接参数 2.3body传参 …...

计算机网络安全之一:网络安全概述

1.1 网络安全的内涵 随着计算机和网络技术的迅猛发展和广泛普及&#xff0c;越来越多的企业将经营的各种业务建立在Internet/Intranet环境中。于是&#xff0c;支持E-mail、文件共享、即时消息传送的消息和协作服务器成为当今商业社会中的极重要的IT基础设施。然而&#xff0…...

未来SLAM的研究方向和热点

SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;是同时定位与地图构建的缩写&#xff0c;指的是机器人或设备在一个未知环境中一边进行自我定位&#xff0c;一边构建出环境的地图。SLAM广泛应用于机器人、自动驾驶、无人机等领域&#xff0c;涉及多个研究方…...

DuodooBMS源码解读之 purchase_change 模块

采购变更模块用户使用手册 一、模块概述 本扩展模块主要用于处理采购变更相关业务&#xff0c;包括采购变更单的创建、展示以及将采购变更信息导出为 Excel 文件等功能。以下将详细介绍该模块的具体使用方法。 二、模块功能及使用方法 &#xff08;一&#xff09;采购变更单…...

uniapp中引入Vant Weapp的保姆级教学(包含错误处理)

废话不多说&#xff0c;直接上方法&#xff0c;网上的教学好多都是错误的 1.安装vant weapp 在Hbuilder的终端&#xff0c;输入以下代码 npm install vant/weapp -S --production 2.新建wxcomponents文件夹 在项目的跟目录新建一个“wxcomponents’文件夹&#xff0c;与app.…...

Effective C++ 读书笔记(十二)

条款三十四&#xff1a;区分接口继承和实现继承 public继承由两部分组成&#xff1a;函数接口继承和函数实现继承。这两者的差异很像函数声明和函数定义之间的差异。 作为类的设计者&#xff0c;我们有时希望派生类只继承成员函数的接口&#xff08;也就是函数声明&#xff0…...

【卡梅德生物】构建噬菌体文库与噬菌体展示文库构建服务新探索

在生命科学与生物技术快速发展的当下&#xff0c;抗体文库构建、构建噬菌体文库以及噬菌体展示文库构建服务在生物医药研发领域中占据着举足轻重的地位。它们不仅是基础研究的重要工具&#xff0c;更是推动抗体药物开发、疾病诊断技术进步的关键力量。 构建噬菌体文库是整个技…...

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter19-表单脚本

十九、表单脚本 表单脚本 JavaScript 较早的一个用途是承担一部分服务器端表单处理的责任。虽然 Web 和 JavaScript 都已经发展了很多年&#xff0c;但 Web 表单的变化不是很大。由于不能直接使用表单解决问题&#xff0c;因此开发者不得不使用JavaScript 既做表单验证&#xf…...

C++STL容器之map

1.介绍 map是 C 标准模板库&#xff08;STL&#xff09;中的一个关联容器&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。map中的元素是按照键&#xff08;key&#xff09;进行排序的&#xff0c;并且每个键在容器中是唯一的。map通常基于红黑树&#xf…...