news 2026/7/7 8:08:35

Python 同步与异步

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 定义的异步函数里才能用

一个 Object 里面有一个 wait 方法,为什么不是 Thread 里面呢?

因为任何一个对象都可以当做锁!

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 async_download_img(img_name): print(f"开始下载:{img_name}") await asyncio.sleep(2) # 异步等待 print(f"下载完成:{img_name}") # 异步执行入口 async def main(): start_time = time.time() # 同时创建3个异步任务并等待 await asyncio.gather( async_download_img("风景.jpg"), async_download_img("人物.jpg"), async_download_img("动物.jpg") ) end_time = time.time() print(f"总耗时:{end_time - start_time:.2f}秒") # 运行异步程序 asyncio.run(main())

看到了吗?总耗时从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 闲下来!!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 8:05:09

5分钟掌握RoundedTB:让Windows任务栏焕然一新的魔法指南

5分钟掌握RoundedTB:让Windows任务栏焕然一新的魔法指南 【免费下载链接】RoundedTB Add margins, rounded corners and segments to your taskbars! 项目地址: https://gitcode.com/gh_mirrors/ro/RoundedTB 想让单调的Windows任务栏瞬间变得现代时尚吗&…

作者头像 李华
网站建设 2026/7/7 8:05:01

大模型Prompt模板管理:从硬编码到配置中心的工程化演进

大模型Prompt模板管理:从硬编码到配置中心的工程化演进 一、一行字符串引发的发布——Prompt为什么需要工程化管理 早期接入大模型应用时,Prompt通常是代码中的一行字符串常量。改一个Prompt词,发布流程是:修改代码 → Code Revie…

作者头像 李华
网站建设 2026/7/7 8:03:15

2026年东莞蜡烛铁托采购必看:当前市面在售尺寸到底齐不齐全

最近3个月我对接了17位做香薰蜡、酥油蜡、文创蜡烛的工厂老板,80%都吐槽过同一个问题:采购蜡烛灯芯铁托的时候,供应商张口就说“尺寸全”,真要下单要么没货,要定制就得等半个月还收高额开模费。刚好这段时间我跑了东莞…

作者头像 李华
网站建设 2026/7/7 8:02:37

NVIDIA Profile Inspector完整指南:深度解锁显卡隐藏性能的终极工具

NVIDIA Profile Inspector完整指南:深度解锁显卡隐藏性能的终极工具 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 你是否曾经疑惑,为什么同样配置的显卡在不同游戏中的表现差异…

作者头像 李华