编程学习网 > 编程语言 > Python > 说说下面几个Python概念:同步,异步,阻塞,非阻塞?
2025
09-18

说说下面几个Python概念:同步,异步,阻塞,非阻塞?


说到“同步”、“异步”、“阻塞”、“非阻塞”这四个词,很多程序员刚入行的时候都容易混淆,尤其是在面试的时候,被问到这几个词是啥意思,脑袋一懵,全靠嘴硬撑过去。我当年面试的时候也被这几个词搞得晕头转向,但真正在项目里踩过几次坑之后,才慢慢搞明白这四个概念到底是怎么回事。今天就拿Python举例子,结合我自己的经验,跟大家聊聊这几个老生常谈但又经常让人抓狂的概念。

先说“同步”和“异步”。这俩最容易被搞混,听起来像是操作系统级别的高大上词汇,其实说白了就是一个事做完了再做下一个,和可以同时干几件事的区别。

在Python里,同步代码就是最常见的那种写法,比如:


这段代码执行下来要3秒,抓数据的时候程序就卡那儿等,等数据抓完了再去处理。这就叫同步,典型的一步一步走流程,像是排队打饭,前面的人不动,你就只能干等着。

那异步是啥?我们看看Python里用 async 和 await 写的异步版本:


这个程序总共只用2秒就搞定了,因为抓数据和处理数据是同时开始的,谁先完事儿就先输出。就像打饭窗口换成了食堂阿姨们齐上阵,多个窗口同时开工,效率蹭蹭的上去了。这就是异步,不再傻等,能干的先干,干不了的放一边。

这时候你可能会问了,那“阻塞”和“非阻塞”又是啥意思?听起来和同步异步很像,其实还是有点差别的。它们主要是描述调用一个操作后,程序是否会被“卡住”。

“阻塞”就是说你执行了某个操作,比如说读文件、访问网络,这玩意儿要是没给你结果,你就只能等在那儿,一动不动,哪怕你CPU很空闲,内存也足够,它也不会去做别的事。

比如这个经典的阻塞IO:


程序会在 recv 那里一直等服务器回数据,等不到就不动。这种就是阻塞IO,谁用谁知道,真的烦。

非阻塞就不一样了,它不会等你,直接返回,然后你可以自己轮询或者注册回调,再回来处理数据。用Python写个简单的非阻塞版本是这样的:

这个看起来就复杂多了,毕竟你得时刻盯着 socket 有没有数据回来,但好处是程序不会被卡住,可以继续做别的事情。

说到这里其实可以画个象限图来理解这四个概念:

  • 同步阻塞:最传统的调用方式,等一个事做完才继续,比如requests库
  • 异步非阻塞:最高效的组合,适合高并发,比如 asyncio + aiohttp
  • 同步非阻塞:虽然同步但不会卡住,比如用 settimeout 控制时间
  • 异步阻塞:这种比较罕见,但也不是不可能,比如你用 async 写了协程但里面用了 time.sleep 这种阻塞操作,那你还是得傻等

别看概念听起来很学术,其实我们在实际开发中经常遇到这些场景。比如你写个爬虫,几十上百个URL要抓,你要是同步阻塞一个个抓,那就等到花儿都谢了。但你换成 aiohttp 来搞异步请求,十几个协程一上,效率立马提升好几倍。

再比如处理用户请求的时候,如果你写了一个接口,这个接口要去调外部API,还得访问数据库,如果你用阻塞的方式写,那用户请求来了只能等你慢悠悠跑完。但如果用异步非阻塞的方式,你就可以同时处理很多请求,提高吞吐量。

不过话说回来,异步虽然香,但也不是银弹。我以前在一个项目里,为了提高并发,把整个接口都用 asyncio 重写了一遍,结果整个团队搞得焦头烂额,debug 成了噩梦。一个 await 写错地方,程序就会莫名其妙卡住,查日志查了两天才找到问题。所以我觉得异步适合用在那种IO密集型的场景,比如网络请求、磁盘读写、数据库操作,但如果是CPU密集型的工作,比如视频转码、图像处理,那还是乖乖用多线程或多进程靠谱。

还有个容易被忽略的点就是,Python 的 GIL(全局解释器锁)也会影响到线程的表现。你以为你开了十几个线程就能同时执行,结果发现一个CPU核心在那儿独舞,其他线程都在边上看热闹。所以现在大家越来越倾向用 asyncio 来搞高并发,既能绕过 GIL 的限制,又能写出结构清晰的代码。

最后再讲个小故事。有一次我们给客户做一个高并发的API网关,那客户的业务峰值能到每秒上千请求,用传统的阻塞模型压根撑不住。我就拍着胸脯说这事儿我来,直接用Python的asyncio撸了个异步网关,接入层用 aiohttp,后端调用数据库用aiomysql,再配合redis缓存,轻轻松松抗住了高峰。后来客户说“你这系统怎么还没宕机?”,我说“你这业务量太小了,连我日志都没打满一页”。

当然,写异步代码是门手艺活,一不小心就容易写成意大利面,维护成本很高。所以我个人的建议是,如果你是一个小项目、小团队,不要一开始就上异步,先把同步写稳了,性能实在不行再考虑异步。如果你是写底层框架或者要支撑百万并发的系统,那异步就是你的老朋友。

总之,同步异步,阻塞非阻塞这些概念,得看场景来选,不要盲目追新。就像我师傅当年跟我说的那句话:“技术不是炫技,是为了解决问题。”各位兄弟们共勉吧。

以上就是“Python大模型应用开发的核心技术有哪些?的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取