在 Python 里搞并发编程,经常绕不开三个关键词:threading、multiprocessing、asyncio。很多人刚开始学会觉得傻傻分不清楚,写代码的时候到底该用哪个,踩坑也很常见。我就试着用大白话聊一下这仨东西到底差在哪,啥时候该用。
threading:多个线程一起跑,但被 GIL 限制
threading 就是线程库,直观的理解是「一个进程里开多个小工人,一起帮忙干活」。但是 Python 有个臭名昭著的 GIL(全局解释器锁),导致同一时刻只有一个线程能执行 Python 字节码。听上去很废对吧?
其实也不完全没用,遇到 I/O 操作的时候特别合适。比如网络请求、文件读写、爬虫之类的,线程在等数据返回的时候 CPU 可以切换去跑别的线程,这样整体就不会卡死。
小例子:用线程同时下载多个网页。
这种场景下,开几个线程比单线程一个一个下快得多。
multiprocessing:直接开多个进程,绕过 GIL
如果你要跑的是 CPU 密集型任务,比如矩阵运算、图像处理、大量计算,这时候线程就没啥优势了,因为 GIL 会让多个线程互相抢锁,结果还不如单线程。
**解决办法就是 multiprocessing**,它是「多进程」,每个进程都有自己独立的 Python 解释器和 GIL,相互之间不干扰。这样就能真正利用多核 CPU。
小例子:计算平方,多个进程一起跑。

这个在 8 核机器上跑起来能明显感受到 CPU 飙升,效率比线程好多了。
asyncio:异步 IO,单线程也能「并发」
第三个 asyncio 看名字就知道和异步有关。它的特点是「单线程 + 协程」,不靠多线程或多进程,而是依赖事件循环。说白了就是 把耗时的 I/O 操作挂起来,空闲的时候去干别的。
这种方式对高并发 I/O 特别友好,比如:写网络服务器、爬虫、聊天室程序。它不像多线程那样有线程切换的开销,也没有多进程那样的内存消耗。
小例子:异步下载网页。

这段代码里,一个线程就能同时处理多个请求,看起来像“并发”,但其实是协程在切换。
- threading:适合 I/O 密集型,代码简单,不想折腾就用它,比如爬虫、日志收集、批量请求接口。
- multiprocessing:适合 CPU 密集型,真正吃满多核 CPU,比如数据分析、图像渲染、机器学习计算。
- asyncio:适合高并发 I/O,尤其是网络编程,轻量高效,比如写爬虫框架、聊天室、微服务网关。
一句话记忆:I/O 用线程,计算用进程,高并发 I/O 用 asyncio。
以上就是“threading、multiprocessing 和 asyncio 的区别是什么?分别适用于哪些场景?”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。扫码二维码 获取免费视频学习资料
- 本文固定链接: http://www.phpxs.com/post/13547/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料