第10章 中间件的使用
第10章 中间件的使用10.1 Python 同步与异步你是否遇到过这样的场景用 Python 写了一个下载图片的脚本它却要一张下载完才能开始下一张效率低得让人着急或者写了个简单的 Web 服务一个慢请求就能卡住后面所有用户其实这背后藏着 Python 中同步与异步的核心逻辑——它们决定了程序如何“安排时间”直接影响着代码的效率。今天我们就用最通俗的语言拆解同步与异步的本质再通过实战案例告诉你什么时候该用同步什么时候该用异步以及异步到底是怎么“提速”的。同步和异步跟多线程没有关系异步可以提高效率。一、先搞懂同步和异步到底在“同步”什么其实同步和异步的核心是程序处理“任务”的顺序和等待逻辑。我们用生活中的例子就能瞬间明白二者的区别。1. 同步“排队办事等完一个再一个”想象你去银行办理业务只有一个窗口对应程序的“单线程”• 你先取号排队前面的人不办完你只能等着• 前面的人可能要填单子、核对信息对应程序中的“IO 操作”比如下载文件、访问数据库哪怕他在填单子时窗口空闲你也不能上前•只有前一个人完全办完离开下一个人才能开始。 这就是同步编程的逻辑任务按顺序执行一个任务没完成尤其是等待 IO 时后面的任务必须“阻塞”等待直到当前任务结束。 用 Python 代码举个同步的例子模拟下载 3 张图片import time # 模拟下载图片IO操作用time.sleep模拟等待时间 def download_img(img_name): print(f开始下载{img_name}) time.sleep(2) # 模拟下载等待此时程序完全阻塞 print(f下载完成{img_name}) # 同步执行 start_time time.time() download_img(风景.jpg) download_img(人物.jpg) download_img(动物.jpg) end_time time.time() print(f总耗时{end_time - start_time:.2f}秒)很明显3 个任务依次执行总耗时是单个任务的 3 倍——这就是同步的“低效”之处等待 IO 时程序完全闲着2. 异步“多件事穿插做不等完也能切换”还是刚才的银行场景但这次你多了个“助手”对应 Python 的“事件循环”你去窗口提交申请后工作人员说“填完单子再来”对应程序发起 IO 请求你不用在窗口等而是去旁边填单子程序释放线程去处理其他任务同时助手帮你盯着窗口——等你填完单子IO 完成助手会提醒你“该你了”程序切换回原任务继续执行这样一来窗口和你都没闲着效率大大提升。这就是异步编程的逻辑任务发起后如果需要等待 IO比如下载、数据库查询程序不会阻塞而是去执行其他任务等 IO 完成后再回来继续处理之前的任务。注意异步不是“同时执行多个任务”那是多线程/多进程而是“在等待的间隙穿插执行其他任务”——本质是“单线程下的任务调度优化”。二、Python 异步的“三要素”你必须掌握的核心语法要在 Python 中写异步代码有三个核心概念必须掌握它们就像异步的“三驾马车” async/await 关键字、 asyncio 库、以及“可等待对象”。1. 关键字async def定义异步函数首先异步函数必须用 async def 定义而不是普通的 def ——这告诉 Python“这个函数是异步的里面可能有等待操作”。# 异步函数用async def定义 async def async_download_img(img_name): print(f开始下载{img_name}) # 这里不能用time.sleep同步等待必须用异步等待 await asyncio.sleep(2) # 异步等待释放线程去处理其他任务 print(f下载完成{img_name})注意普通函数里不能用 await只有 async def 定义的异步函数里才能用。2. 关键字await等待“可等待对象”await 的作用是“暂停当前异步函数去执行其他任务直到等待的对象完成”。它后面必须跟“可等待对象”比如异步函数、asyncio.Task 等。为什么不能用 time.sleep(2)因为 time.sleep 是同步等待会阻塞整个线程——而异步需要的是“异步等待”所以要用 asyncio.sleep(2)它是异步的会释放线程。3. 库asyncio 管理异步任务asyncio是 Python 标准库中专门用于异步编程的库它提供了“事件循环”相当于之前说的“助手”、任务调度、IO 管理等核心功能。最常用的方法是 asyncio.run()——它会创建一个事件循环运行异步函数然后关闭循环run 里面一般放入一个协程。import asyncio import time async def download_img(image_name): print(f开始下载图片:{image_name}) await asyncio.sleep(2) print(图片下载完成) async def main(): start_time time.time() await asyncio.gather( download_img(风景.jpg), download_img(人物.jpg), download_img(宠物.jpg) ) end_time time.time() print(f总耗时:{end_time - start_time}) if __name__ __main__: asyncio.run(main()) asyncio.run(download_img(电影.mp4))看到了吗总耗时从6 秒降到了 2 秒——这就是异步的魔力三个任务的“等待时间”重叠了三、同步 vs 异步什么时候该用哪个很多人会觉得“异步比同步好所有场景都该用异步”——这其实是误区。同步和异步各有适用场景选错了反而会适得其反。我们用一张表对比二者的核心差异和适用场景举个例子如果你写一个“计算 1 到 100000 的质数”的程序CPU 密集用异步没用——因为 CPU 一直在工作没有等待间隙异步无法切换任务如果你写一个“爬取 100 个网页”的程序IO 密集用异步就很合适——因为爬网页时大部分时间在等服务器响应异步可以在等待时爬其他网页四、常见误区异步不是“银弹”最后我们澄清几个关于 Python 异步的常见误区帮你避免踩坑1. 异步 ≠ 多线程/多进程异步是“单线程下的任务调度”而多线程/多进程是“真正的并行执行”。异步不能解决 CPU 密集型任务的效率问题因为它本质还是单线程。2. 不是所有库都支持异步很多 Python 库是同步的比如 requests 、 sqlite3 在异步函数里用这些库会阻塞线程——必须用对应的异步库比如 aiohttp 对应 requests 、 asyncpg 对应 psycopg2 。3. 异步代码不一定比同步快 如果任务量很小或者 IO 等待时间极短比如本地文件读写异步的“调度开销”可能比节省的等待时间还多反而更慢。 总结 回到开头的问题为什么有的 Python 程序效率低因为它用了同步逻辑处理 IO 密集型任务浪费了大量等待时间。同步和异步没有绝对的好坏关键是“对症”•当任务需要大量等待IO 密集用异步 async/await asyncio 让程序“不闲着”•当任务需要大量计算CPU 密集用同步 多线程/多进程让 CPU“不闲着”。异步就是不要让 cpu 闲下来

相关新闻

51单片机入门:从硬件电路到代码烧录,详解LED点亮的完整流程与避坑指南

51单片机入门:从硬件电路到代码烧录,详解LED点亮的完整流程与避坑指南

1. 项目缘起:从“点灯”开始的嵌入式世界如果你刚拿到一块51单片机开发板,或者刚刚开始学习单片机编程,那么“点亮一个LED灯”几乎是你无法绕开的第一个实验。这个实验简单到几乎被所有教程一笔带过,但恰恰是这份“简单”&#xf…

2026/10/13 18:18:09 阅读更多 →
从灰度传感器到PID控制:STM32循迹小车实战指南

从灰度传感器到PID控制:STM32循迹小车实战指南

1. 从“灰度”到“灰度传感器”:一个概念的工程化之旅“灰度”这个词,乍一听有点抽象,像是设计师调色板上的一个术语,或者产品经理口中的“灰度发布”。但如果你接触过机器人、智能车或者自动化控制,你对它的理解会立刻…

2026/10/12 19:41:54 阅读更多 →
数字电路基础:深入解析基本SR触发器的工作原理与应用

数字电路基础:深入解析基本SR触发器的工作原理与应用

1. 项目概述:从“记忆”开始聊起在数字电路的世界里,我们常常需要一种能“记住”过去状态的东西。比如,你按一下遥控器,电视开机了,再按一下,电视关机。遥控器发出的只是一个短暂的脉冲信号,但电…

2026/10/8 21:10:47 阅读更多 →

最新新闻

ArcMap发布地图到ArcGIS Online:桌面GIS与云GIS协同实战指南

ArcMap发布地图到ArcGIS Online:桌面GIS与云GIS协同实战指南

手头有一张用 ArcMap 配了半天的专题图,领导突然提了一句“网页上能不能打开看看”。以前遇到这种情况,要么导出图片发过去,要么把工程文件拷给同事,但对方电脑上不一定装了 ArcMap,更别说打开后符号字体全乱。后来我把…

2026/10/13 18:18:11 阅读更多 →
AI代码生成视频的五步工程化流水线

AI代码生成视频的五步工程化流水线

1. 项目概述:别被“AI生成视频”带偏了节奏最近刷到不少标题党内容,说什么“Claude Opus 5.5 支持原生视频生成”“大模型终于能直接吐出MP4了”,点进去一看,要么是概念混淆,要么是把代码执行结果当成了视频生成。我作…

2026/10/13 18:18:11 阅读更多 →
手写Bagging与AdaBoost:从数学原理到NumPy原生实现

手写Bagging与AdaBoost:从数学原理到NumPy原生实现

1. 这不是调包,是亲手搭起集成学习的脚手架“Bagging”和“AdaBoost”这两个词,在机器学习入门课里常被简化成两行公式、三张权重图、一段sklearn.ensemble的调用示例。但真正带过学生做课程设计、也帮某高校实验室调试过模型的同学都知道:当…

2026/10/13 18:18:11 阅读更多 →
不依赖偏差规则的多元时间序列异常检测:CyFA超越GDN与KDA

不依赖偏差规则的多元时间序列异常检测:CyFA超越GDN与KDA

这阵子一直在做多变量时间序列异常检测的对比实验,说实话,GDN和KDA这类方法能长期站在基线榜前列,确实有它们的道理。但我自己复现和改动过程中越来越确认一件事:它们对“偏差规则”(我们项目里习惯叫Delta Rule&#…

2026/10/13 18:18:11 阅读更多 →
VINS-FUSION代码阅读指南:从数据结构到滑动窗口优化

VINS-FUSION代码阅读指南:从数据结构到滑动窗口优化

1. 从"能跑通"到"能改懂":VINS-FUSION代码阅读的切入点选择很多人第一次打开VINS-FUSION的代码仓库时,第一反应是"文件好多、类好多、回调好绕"。这很正常,因为它本身就是一个把视觉前端、IMU预积分、滑动窗口…

2026/10/13 18:18:11 阅读更多 →
Java面试实录:从JVM到MySQL,那些让面试官崩溃的基础错误

Java面试实录:从JVM到MySQL,那些让面试官崩溃的基础错误

互联网大厂Java开发者面试实录:严肃面试官遇上搞笑水货程序员谢飞机如果你没经历过那种"简历挺漂亮,开口就崩盘"的Java面试,那你可能还没当过面试官。我在某头部电商平台做Java技术面试官已经有年头了,每周至少面七八个…

2026/10/13 18:17:10 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →