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

python异步协程async调用过程图解

1.背景:

项目中有用到协程,但是对于协程,线程,进程的区别还不是特别了解,所以用图示的方式画了出来,用于理清三者的概念。

2.概念理解:

2.1协程,线程,进程包含关系
  • 一个系统可以有多个进程
  • 一个进程可以有多个线程(多个线程为了提高进程的资源利用率)
  • 一个线程可以有多个协程(多个协程为了提高线程的资源利用率)

2.2 共享资源范围 ,隔离性, 通信方式,适用场景对比

PS:该表从Kimi拷贝

名称共享资源范围 隔离性通信方式适用场景
进程独立内存空间、文件描述符、系统资源管道、消息队列、共享内存、套接字适用于需要高隔离性和独立资源的场景,如多用户环境或需要保护数据安全的场景。
线程进程内存空间、文件描述符、系统资源共享内存、互斥锁、条件变量适用于需要共享内存和高效通信的场景,如多任务处理或计算密集型任务。
协程线程内存空间、文件描述符、系统资源 非常低异步机制(awaitasyncio.Queue适用于 I/O 密集型任务,如网络请求、文件读写等,可以高效地利用单线程资源,避免线程切换的开销。

3,协程执行过程示意图

3.1 执行代码
#异步调用
import asyncioasync def model_gen(task,time):# 模拟异步过程print('进入' + task)await asyncio.sleep(time)  # 假设模型生成需要5秒print('处理继续'+ task)await asyncio.sleep(time)  # 假设模型生成需要5秒print('完成' + task)return task+'完成'async def main(name):# 异步调用print(name)#同步函数:asyncio.create_task() 是一个同步函数,它会立即返回一个 Task 对象。#返回的Task对象会被事件循环调度执行,asyncio.create_task() 本身不会等待任务完成。#asyncio.create_task() 提供了一种简单的方式来将协程包装成任务并提交到事件循环中,而不会阻塞调用它的线程。task1 = asyncio.create_task(model_gen('task1',4))print('create task1')task2 = asyncio.create_task(model_gen('task2',2))print('create task2')# 等待两个任务完成,并获取结果# await 是一个异步操作,当在协程中遇到 await 表达式时,当前协程会暂停执行,并将控制权交还给事件循环。result2 = await task2  # 协程挂载,task2执行完毕之后,才继续执行后续作业print('hello')result1 = await task1  # task1执行完毕之后,才能继续执行后续代码# 打印结果print("所有任务完成!")print(result1)print(result2)#asyncio.run是同步函数,会阻塞当前线程,所以main('main1')全部执行完毕之后,才能执行main2的代码
asyncio.run(main('main1'))
asyncio.run(main('main2'))
3.2 执行结果

main1
create task1
create task2
进入task1
进入task2
处理继续task2
处理继续task1
完成task2
hello
完成task1
所有任务完成!
task1完成
task2完成
main2
create task1
create task2
进入task1
进入task2
处理继续task2
处理继续task1
完成task2
hello
完成task1
所有任务完成!
task1完成
task2完成

3.3 执行图解及理解

图解如下:左边三列是协程,第四列是线程的占用情况,最右边是执行结果输出。

个人理解:(如果有问题,欢迎指正,目前循环事件如何确定执行哪个协程的这一块还没有研究)

1)每个协程启动之后,一直执行,直到挂起(比如await),可以是挂起多长时间,也可以是等待某个操作完成。挂起结束之后,协程变为可调用的状态,供事件循环调用
2)事件循环从可调用的协程中,将其放到协程进行执行,直到该协程挂起,再取下一个可调用协程执行。
3)每次协程被调用之后,会一直执行直到下一次挂起(比如await),所以如果协程中有一个非常耗时的同步操作,就有可能导致包含该操作的协程一直占用线程,导致其他协程一直等待。所以写异步程序时候,需要确认是否有非常耗时的同步操作。

相关文章:

python异步协程async调用过程图解

1.背景: 项目中有用到协程,但是对于协程,线程,进程的区别还不是特别了解,所以用图示的方式画了出来,用于理清三者的概念。 2.概念理解: 2.1协程,线程,进程包含关系 一…...

【Java学习笔记】选择结构

选择结构 内容结构 一、顺序结构 二、分支控制 (1)单分支 (2)双分支 (3)多分支 (4)嵌套分支 (5)switch 分支结构 三、switch和if的比较 一、顺序结构…...

java Nacos

windows下载nacos,版本2.x的,1.0的话会出现“Server check fail, please check server 127.0.0.1 ,port 9848 is available , error {}” 这个鬼问题 下载链接 这里用的是2.0.4版本,启动的话用 startup.cmd -m standalone,单体启…...

c语言之杂识

前言 主要说一下c语言的杂知识 一、预处理指令 1. #include #include指令用于包含其他头文件的内容到当前文件中。这允许您在程序中使用其他模块定义的函数和变量。 示例&#xff1a; #include <stdio.h> // 包含标准输入输出头文件int main() {printf("Hello…...

CSS内边距、外边距、边框

CSS内边距 内边距 &#xff1a;内容区&#xff08;Content&#xff09;与边框&#xff08;Border&#xff09;之间的透明间距&#xff0c;用于增加元素内部的留白。不影响元素内容本身的尺寸&#xff08;如文字大小&#xff09;&#xff0c;但会增大元素的总占用空间。 以下是…...

融山科技前端面经

前端面试问题解答 这次是波珠的第三次面试&#xff0c;持续打怪升级&#xff0c;积累面试中面试官问到的不会的点子。 1.自我介绍 面试官您好&#xff0c;我是来自XX学校XX专业本科的XX名字&#xff0c;然后介绍在学校情况&#xff0c;我就介绍了大一自学前端&#xff0c;然…...

元素滚动和内容垂直居中同时存在,完美的 html 元素垂直居中的方法flex + margin: auto

假设有一个元素 div 作为父容器且宽高固定&#xff0c;里面的内容 content 在父容器中垂直/水平都居中&#xff0c;且当内容很多时&#xff0c;父元素滚动overflow: auto&#xff0c;content的内容要能够完全展示。 我之前在这篇文档提到了两个方法&#xff1a; 使用 flex s…...

STM32F103 单片机(基于 ARM Cortex-M3 内核)的启动过程涉及硬件初始化、固件配置和程序执行流程。

1. 启动模式与地址映射 STM32F103 的启动模式由 BOOT0 和 BOOT1 引脚配置决定&#xff0c;不同的启动模式对应不同的存储器映射&#xff1a; 启动模式 映射地址范围 说明 主 Flash 0x08000000~0x0807FFFF 用户程序存储在 Flash 中&#xff0c;复位后从 Flash 启动&#xff08…...

c++中iota容器和fill的区别

在C 中&#xff0c;std::iota 和 std::fill 都是标准库中的函数&#xff0c;用于对序列进行操作&#xff0c;它们的功能和用法如下&#xff1a; std::iota 功能&#xff1a;std::iota 函数用于将一个连续的递增序列赋值给指定范围的元素。它接受三个参数&#xff0c;第一个参…...

Kafka集群

kafka集群: kafka-server-start.sh;kafka-server-stop.sh cd/opt/software/kafka/ kafka.sh上传:cd /usr/local/bin/ 执行文件变成绿色&#xff1a;chmod 777 kafka.sh Kafka.sh start Xcall.sh jps...

多源数据集成技术分析与应用实践探索

摘要&#xff1a;本文聚焦多源数据集成技术&#xff0c;深入剖析联邦式、基于中间件模型及数据仓库三类主流技术的侧重点与应用场景。通过实际案例阐述多源数据集成应用构建过程&#xff0c;旨在为企业数据整合与共享提供理论指导与实践参考&#xff0c;助力企业提升数据利用效…...

UniOcc:自动驾驶占用预测和预报的统一基准

25年3月来自 UC Riverside、U Wisconsin 和 TAMU 的论文"UniOcc: A Unified Benchmark for Occupancy Forecasting and Prediction in Autonomous Driving"。 UniOcc 是一个全面统一的占用预测基准&#xff08;即基于历史信息预测未来占用&#xff09;和基于摄像头图…...

反向代理和DDNS的区别是什么?

反向代理&#xff08;Reverse Proxy&#xff09;和动态域名解析&#xff08;DDNS&#xff0c;Dynamic Domain Name System&#xff09;是两种不同的网络技术&#xff0c;虽然它们都与外部访问内部服务相关&#xff0c;但解决的问题和应用场景完全不同。具体区别如下&#xff1a…...

markdown展示数学公式

要让Markdown正确展示数学公式&#xff0c;你需要使用支持数学公式渲染的工具&#xff0c;比如在支持LaTeX语法的Markdown编辑器中进行编写。 Markdown本身并不原生支持数学公式的渲染&#xff0c;但许多Markdown解析器&#xff08;例如在GitHub、Jupyter Notebooks、或一些博…...

服务器编译环境配置及数据接收脚本编写(11)

文章目录 一、本章说明二、云端服务器Python编译环境配置三、传感数据解析脚本编写一、本章说明 注:本节为【基于STM的环境监测系统(节点+云服务器存储+QT界面设计)】项目第11篇文章,上面两篇介绍了云服务器数据库的安装与相关设置,本章主要介绍在服务器中安装Python编译…...

硬件基本概念

目录 基本概念 电压 电流 串联、并联 欧姆定律 电路仿真网址&#xff1a; 功率 焦耳定律 AC220V 转 DC5V 基本电子元器件了解 电阻&#xff1a;&#xff08;电阻器&#xff09; 电容 电感 继电器 二极管 三极管 晶振&#xff08;晶体振荡器&#xff09; 光耦…...

Spark与Hadoop之间的联系与区别

联系 生态系统互补&#xff1a; Hadoop 是一个分布式存储和计算平台&#xff0c;主要包括 HDFS&#xff08;分布式文件系统&#xff09;和 MapReduce&#xff08;分布式计算框架&#xff09;。Hadoop 提供了可靠的数据存储和分布式计算的基础。 Spark 是一个高性能的分布式计算…...

spark和Hadoop之间的对比与联系

对比 计算模型&#xff1a; Hadoop&#xff1a;采用MapReduce计算模型&#xff0c;分map与reduce两个阶段&#xff0c;数据处理按阶段顺序执行&#xff0c;数据处理按阶段顺序执行&#xff0c;中间结果会写入磁盘&#xff0c;I/O开销大。 Spark&#xff1a;基于弹性分布式数…...

0802api设计和实战-网络ajax请求1-react-仿低代码平台项目

文章目录 1 API设计1.1 用户功能1.1.1 获取用户信息1.1.2 注册1.1.3 登录 1.2 问卷功能1.2.1 获取单个问卷1.2.2 获取问卷列表1.2.3 创建问卷1.2.4 更新问卷1.2.5 批量彻底删除问卷1.2.6 复制问卷 1.3 小结 2 实战2.1配置axios2.2 封装API和测试2.3 新建问卷2.4 自定义hooks封装…...

什么是CAN的非破坏仲裁?

‌CAN总线的非破坏性仲裁‌是一种在多个设备同时发送数据时&#xff0c;通过标识符&#xff08;ID&#xff09;优先级来决定哪个设备可以优先发送数据的机制。其核心思想是&#xff1a;当多个设备同时发送数据时&#xff0c;ID值较小的数据具有更高的优先级&#xff0c;能够优先…...

无线监控系统分类全解析:搭配视频融合平台EasyCVR开启高效监控

随着技术的发展&#xff0c;无线监控系统在家庭、小型企业、特定行业以及室外恶劣环境中的应用越来越广泛。本文将介绍几种常见的无线监控系统&#xff0c;分析其优缺点&#xff0c;并结合EasyCVR视频融合平台的功能&#xff0c;探讨如何优化无线监控系统的性能和应用。 一、主…...

并行RANSAC平面拟合(C++)

依赖库 1&#xff09;Eigen 2&#xff09;GLM 算法大致思路 Step 1&#xff1a;源点云随机采样3个点&#xff1b; Step 2&#xff1a;3个点拟合平面&#xff0c;统计符合该平面模型的点&#xff0c;为inlier点&#xff1b; Step 3&#xff1a;判断inlier点比例是否达到阈…...

Docker核心技术精讲:从入门到企业级实战

&#xfeff;第一章>Docker概述 第二章>Docker安装与镜像下载加速 第三章>镜像 第四章>容器 第五章>发布镜像到阿里云或私有化仓库 第六章>容器卷 第七章>Docker安装常用软件 第八章>Docker高级版-Mysql主从复制、Redis主从、分布式存储 第九章>Doc…...

【KWDB 创作者计划】_深度学习篇---向量指令集

文章目录 前言一、加速原理数据级并行&#xff08;DLP&#xff09;计算密度提升减少指令开销内存带宽优化隐藏内存延迟 二、关键实现技术1. 手动向量化&#xff08;Intrinsics&#xff09;优势挑战 2. 编译器自动向量化限制 3. BLAS/LAPACK库优化4. 框架级优化 三、典型应用场景…...

音视频小白系统入门课-4

本系列笔记为博主学习李超老师课程的课堂笔记&#xff0c;仅供参阅 往期课程笔记传送门&#xff1a; 音视频小白系统入门笔记-0音视频小白系统入门笔记-1音视频小白系统入门笔记-2音视频小白系统入门笔记-3 将mp4文件转换为yuv文件 ffmpeg -i demo.mp4 # 输入文件-an …...

CS144 Lab3 实战记录:TCP 发送器实现

文章目录 1 实验背景与目标2 TCP发送器的实现2.1 整体流程2.2 核心组件2.3 窗口管理2.4 关键函数实现2.4.1 push函数2.4.2 receive函数2.4.3 tick函数 3 仓库地址 1 实验背景与目标 在 TCP 协议中&#xff0c;发送器&#xff08;TCP Sender&#xff09;是实现可靠传输的核心组…...

Transformer:引领深度学习新时代的架构

引言 在深度学习的快速发展历程中&#xff0c;Transformer 架构如同璀璨的新星&#xff0c;照亮了自然语言处理&#xff08;NLP&#xff09;以及计算机视觉&#xff08;CV&#xff09;等众多领域的前行道路。自 2017 年在论文《Attention Is All You Need》中被提出以来&#…...

基于RabbitMQ实现订单超时自动处理

基于RabbitMQ实现订单超时自动处理 引言 在现代电商系统中&#xff0c;订单超时自动取消是一个常见的业务需求。传统的定时任务扫描数据库的方式存在性能瓶颈和实时性差的问题。本文将介绍如何使用RabbitMQ的消息队列和死信队列特性&#xff0c;构建一个高效可靠的订单超时自…...

nginx实现同一个端口监听多个服务

nginx实现同一个端口监听多个服务 前言原理配置不同域名基于路径&#xff08;URL 路由&#xff09;​补充 总之完结撒花&#xff0c;如有需要收藏的看官&#xff0c;顺便也用发财的小手点点赞哈&#xff0c;如有错漏&#xff0c;也欢迎各位在评论区评论&#xff01; 前言 受同…...

用 Firebase 和 WebRTC 快速搭建一款浏览器视频聊天应用

在现代 Web 应用中&#xff0c;实时音视频通信变得越来越普遍。本文将通过一个简洁实用的示例&#xff0c;带你一步步搭建一个基于 Firebase WebRTC 的浏览器视频聊天应用&#xff0c;帮助你理解 WebRTC 的核心通信机制以及如何借助 Firebase 进行信令传输。 &#x1f527; 技…...

记录一次OGG进程abended,报错OGG-01431、OGG-01003、OGG-01151、OGG-01296问题的处理

1. ogg进程abended的几种常见原因&#xff1a; 1. undo表空间不足导致abended。 2. 数据不一致&#xff0c;违反唯一约束导致abended。 3. 源端和目标端表结构不一致导致abended。 4. 源端表名过长&#xff0c;同步到目标端报错导致abended。 5. OGG-03517字符集转换问题导…...

机器学习分类算法详解:原理、应用场景与测试用例

机器学习分类算法详解:原理、应用场景与测试用例 一、基础分类算法 1. 决策树 原理: 通过递归划分数据集,选择信息增益(ID3)或基尼系数(CART)最大的特征作为分裂节点,构建树结构。叶节点代表分类结果。应用场景: 医疗诊断(需解释性,如判断疾病风险)。客户分群(如根…...

机器人仿真:相机信息仿真及显示

1)概要 除了激光雷达以外,机器人常用的视觉传感器还包括相机,相机图像能够获取真实世界的真实颜色和纹理信息,能够被用于进行目标检测、分割和追踪。 2)结果展示...

车载功能测试-车载域控/BCM控制器测试用例开发流程【用例导出方法+优先级划分原则】

目录 1 摘要2 位置灯手动控制简述2.1 位置灯手动控制需求简述2.2 位置灯手动控制逻辑交互图 3 用例导出方法以及优先级原则3.1 用例导出方法3.1.1 用例导出方法介绍3.1.2 用例导出方法关键差异分析 3.2 优先级规则3.2.1 优先级划分的核心原则3.2.2 具体等级定义与判定标准 3.3 …...

gem5-gpu教程05 内存建模

memory-modeling|Details on how memory is modeled in gem5-gpu ====== gem5-gpu’s Memory Simulation ====== gem5-gpu, for the most part, eschews GPGPU-Sim’s separate functional simulation and instead uses gem5’s execute-in-execute model. Therefore, memory …...

如何提升个人解决问题的能力?

提升个人解决问题的能力是一个系统性工程&#xff0c;涉及思维、知识、经验和心态的多方面提升。以下是一些具体且可操作的方法&#xff0c;帮助你逐步增强解决问题的能力&#xff1a; 1. 培养「结构化思维」 明确问题本质&#xff1a; 遇到问题时&#xff0c;先问自己&…...

CSS清楚默认样式

* {margin: 0;padding: 0;box-sizing: border-box;} 这段 CSS 代码是一个常见的全局样式重置代码块&#xff0c;它会对网页中的所有元素&#xff08;通过通配符 * 选择器&#xff09;应用相同的样式规则&#xff0c;下面分别解释每一条规则的作用。 margin: 0; 在 HTML 中&a…...

问题:raw.githubusercontent无法访问

问题&#xff1a;raw.githubusercontent无法访问 文章目录 一、问题二、hosts文件2.1、hosts文件简介2.2、hosts文件位置2.3、hosts文件修改 3、解决方法3.1、查询出raw.githubusercontent.com的ip地址3.2、在/etc/hosts里填写IP地址3.3、再次执行命令 4、一些常用IP地址 一、问…...

【C语言】文本操作函数fgetc、fputc、fgets、fputs、fprintf、fscanf、fread、fwrite

一、介绍 二、简要概括 三、函数的使用 1、fgetc和fputc int fgetc ( FILE * stream ); 从文件中读取信息&#xff0c;每次读取一个字符 从流中获取字符返回指定流的内部文件位置指示符当前指向的字符。然后将内部文件位置指示符推进到下一个字符 int main() {//打开文件FI…...

(19)VTK C++开发示例 --- 分隔文本读取器

文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;VTK开发 &#x1f448; 1. 概述 本例采用坐标和法线&#xff08;x y z nx ny nz&#xff09;的纯文本文件&#xff0c;并将它们读入vtkPolyData并显示…...

C++ 中 std::thread 的高级应用

C 中 std::thread 的高级应用、常见坑&#xff0c;以及如何封装为类&#xff0c;适合做线程池、异步任务、后台 worker、并发调度等场景。内容结构如下&#xff1a; 一、std::thread 高级用法清单 1. 线程成员函数调用&#xff08;this 捕获&#xff09; class Worker { publ…...

Linux之彻底掌握防火墙-----安全管理详解

—— 小 峰 编 程 目录&#xff1a; 一、防火墙作用 二、防火墙分类 1、逻辑上划分&#xff1a;大体分为 主机防火墙 和 网络防火墙 2、物理上划分&#xff1a; 硬件防火墙 和 软件防火墙 三、硬件防火墙 四、软件防火墙 五、iptables 1、iptables的介绍 2、netfilter/…...

Linux安装ffmpeg7.1操作说明

安装yasm Index of /projects/yasm/releases/ 下载最新版 wget https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz 解压 tar -zxvf yasm-1.3.0.tar.gz 编译及安装 ./configure make && make install 安装ffmpeg https://download.csdn.net/down…...

Java 加密与解密:从算法到应用的全面解析

Java 加密与解密&#xff1a;从算法到应用的全面解析 一、加密与解密技术概述 在当今数字化时代&#xff0c;数据安全至关重要。Java 加密与解密技术作为保障数据安全的关键手段&#xff0c;被广泛应用于各个领域。 加密是将明文数据通过特定算法转换为密文&#xff0c;使得…...

海思SDK的sensor驱动框架

对于海思的SDK之前一直对驱动的框架不清楚&#xff0c;只知道mpp的目录下的一些简单的业务demo&#xff0c;归根结底对这个SDK的框架还是不够了解&#xff0c;研究了一段时间才对该框架有一点认识。SDK是通过Makefile来管理和编译的所以对于Makefile文件需要有一定的理解&#…...

MyBatis-Plus 使用 Wrapper 构建动态 SQL 有哪些优劣势?

MyBatis-Plus (MP) 提供的 Wrapper (如 QueryWrapper, LambdaQueryWrapper, UpdateWrapper, LambdaUpdateWrapper) 是其核心特性之一&#xff0c;它允许我们在开发时以面向对象的方式构建 SQL 的 WHERE 条件、ORDER BY、SELECT 字段列表等部分。与传统的 MyBatis 在 XML 文件中…...

【PGCCC】Postgres 故障排除:修复重复的主键行

如何从表中删除不需要的重复行。这些重复行之所以“不需要”&#xff0c;是因为同一个值在指定为主键的列中出现多次。自从 glibc 好心地改变了排序方式后&#xff0c;我们发现这个问题有所增加。当用户升级操作系统并修改底层 glibc 库时&#xff0c;这可能会导致无效索引。 唯…...

Java多线程的暗号密码:5分钟掌握wait/notify

wait和join的区别 wait和join在使用上都是等待。 但是join是等待其他线程结束&#xff0c;而wait是等待其他线程的notify通知再运行。 当拿到锁的线程&#xff0c;发现要执行的任务时机不成熟的时候&#xff0c;使用wait进行阻塞等待&#xff0c;然后等时机成熟了再notify通…...

【重学Android】03.高版本 Android Studio 不能使用引用库资源ID的问题

问题背景 由于直接下载的最新版本Android Studio&#xff0c;然后直接创建的新项目&#xff0c;因此默认的工程配置相比以前的老版本有了不少的变化&#xff0c;Gradle的新版本使用&#xff0c;导致一些配置项也发生了变化&#xff0c;加上谷歌针对gradle.properties文件的一些…...

8. kubernetes的service原理

Kubernetes 的 Service 是集群内部和外部访问 Pod 的核心抽象层&#xff0c;解决了 Pod 动态 IP 变化及负载均衡问题。以下是其核心概念、原理及使用方法&#xff1a; 一、Service 的核心概念 概念说明服务发现通过标签选择器&#xff08;selector&#xff09;动态关联一组 Po…...