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

async/await

在 Python 里聊 async/await,其实有点像聊怎么在一条单行道上安排多辆车同时出发,但又不堵车。

很多人刚接触时会觉得,这不就是多线程吗?其实不太一样。多线程是系统给你安排多个车道,每个车道跑一辆车,但 Python 里的线程因为 GIL 的存在,很多时候是“假并行”,更像是一个调度员快速切换车道上的车,让它们轮流跑。而 async/await 更像是一条车道,但每辆车都知道自己什么时候该让一下,好让别的车先走一段。

举个例子,假设你在写一个网络爬虫,要请求十个不同的网站。如果用传统同步的方式,代码会依次发起请求,等第一个网站返回数据了,再去请求第二个,这期间你的程序大部分时间在“空等”,就像在收费站排队,前面车付钱时,后面只能干等。

如果用 async/await,发起第一个请求后,不用等它回来,就可以立刻发起第二个、第三个……等到某个请求的数据回来了,再回来处理它。这就像在同一个窗口同时交十份材料,每份材料处理需要时间,但处理员在等的间隙可以处理另一份,而不是傻等。

但要注意,async/await 并不会让代码自己变快,它只是让你在“等待 IO”的时候能做别的事。如果你的任务全是计算密集型的,比如算圆周率,那用它反而可能增加复杂度,效果也不明显。

在语法上,async 放在函数定义前,意思是这个函数可以暂停和恢复;await 放在需要等待的操作前,意思是“这里可能要等,先让其他任务跑吧”。

不过,真正用好 async/await 需要理解事件循环(event loop)—— 你可以把它想象成一个总调度员,负责在多个任务之间切换,哪个任务等的东西到了,就让它继续执行。

很多人容易掉进一个坑:在 async 函数里调用了阻塞的同步代码,比如用了某个不支持异步的库,结果整个事件循环就卡住了。所以一般会建议,用了 async/await,配套的库最好也是异步的,比如 aiohttp 而不是 requests。

还有一点,异步代码的调试比同步代码麻烦一些,因为执行顺序不那么直观。有时候打印日志会发现,明明代码写的是 A 在 B 前面,打印出来却是 B 先出现,这就是因为任务切换导致的。

总的来说,async/await 是 Python 处理 IO 密集型任务的一把利器,但它不是银弹。用之前先想清楚场景,如果全是 CPU 计算,可能多进程更合适;如果是大量网络请求、文件读写这类“等待型”工作,那异步会带来明显的效率提升。

刚开始写可能会觉得绕,写多了就会习惯这种“让路”式的编程思维。

http://www.jsqmd.com/news/583723/

相关文章:

  • STM32与鸿蒙LiteOS的空气污染监测系统开发
  • 杰理之开mic关mic复位问题处理【篇】
  • ESP32Touch异步电容触摸库:工业级抗干扰设计与FreeRTOS集成
  • STM32时钟系统架构与配置详解
  • 从SEO到GEO:2026年AI搜索优化服务商深度解析与选型指南 - 2026年企业推荐榜
  • STM32F10x独立看门狗(IWDG)底层驱动与高可靠设计
  • decorator
  • AVR单片机Vcc电压精确测量库MCUVoltage
  • ESP32轻量级电池电量估算库:基于ADC电压查表的SOC计算方案
  • 在 RAG 驱动的应用中的路由
  • 嵌入式系统中单例模式的应用与实现
  • 2025最权威的十大AI写作网站实测分析
  • context manager
  • Abaqus模拟铝合金搅拌摩擦焊顺序热力耦合过程:残余应力仿真与最优焊接方案对比
  • SerialToProcessing:面向Processing的嵌入式轻量串口协议
  • 2026届学术党必备的AI辅助写作工具推荐榜单
  • 《算法题讲解指南:动态规划算法--子数组系列》--21.乘积最大子数组,22.乘积为正数的最长子数组
  • Go语言的错误处理:从panic到优雅降级
  • 多层PCB内部结构与工艺全解析
  • ARM-Linux与MCU开发的核心差异解析
  • Go语言的并发编程:从Goroutine到Channel
  • C/C++堆栈工作机制与优化实践
  • JTAG接口原理与故障诊断实战指南
  • C语言断言函数:原理、应用与最佳实践
  • NuvIoT_Utils:嵌入式IoT终端轻量级硬件抽象工具库
  • 《掌控习惯》书摘3
  • 嵌入式开发入门:串口通信与Linux操作实战
  • MB85RCxx FRAM嵌入式I²C驱动设计与工程实践
  • Go语言的性能优化:从分析到实践
  • 太卷了,阿里一面试官把多年总结的Java八股文完全开源了.......