Python多线程系统学习路线第216讲_核心原理与实战案例详解【指导】
发布时间 - 2025-12-27 00:00:00 点击率:次Python多线程无法加速CPU密集型任务,因CPython的GIL强制单线程执行字节码;仅I/O密集型任务适用threading,CPU密集型必须用multiprocessing或ProcessPoolExecutor。
Python 的多线程在 CPU 密集型任务中基本不加速,这是由 GIL(全局解释器锁)决定的,不是写法或版本问题。
为什么 threading 无法提升 CPU 密集型任务性能
CPython 解释器为保证内存管理安全,在同一时刻只允许一个线程执行 Python 字节码。GIL 是互斥锁,不是可配置开关,也无法通过多核绕过。
- 所有纯 Python 循环、数值计算(如
sum([x**2 for x in range(10**7)]))都受GIL限制 -
threading.Thread启动再多,CPU 使用率也不会超过单核 100% - 只有当线程因 I/O(如
time.sleep()、requests.get()、文件读写)主动释放GIL时,其他线程才能运行
什么时候该用 threading,而不是 multiprocessing
适用场景非常明确:高并发 I/O 等待,且任务间无强状态共享需求。
- 同时发起 100 个 HTTP 请求 → 用
threading+requests(每个请求阻塞时自动让出GIL) - 监听多个 socket 连接并响应 →
threading比multiprocessing启动快、内存开销小 - 需要共享内存对象(如
dict、list)且不涉及复杂同步 →threading可直接引用,multiprocessing需用Manager或Queue - 避免
multiprocessing在 Windows 上反复导入主模块的问题
threading.Thread 启动后不执行?常见卡点
最常被忽略的是没调用 start(),而是误调了 run —— 后者只是普通函数调用,仍在主线程同步执行。
()
import threading import timedef worker(): time.sleep(1) print("done")
t = threading.Thread(target=worker) t.run() # ❌ 错误:同步执行,不启新线程
t.start() # ✅ 正确:异步启动线程
- 忘记
t.join()导致主线程退出,子线程被强制终止(尤其脚本末尾无等待) - 使用
lambda传参时闭包陷阱:for i in range(3): Thread(target=lambda: print(i))会全打印2,应写成lambda i=i: print(i) - 未处理异常:线程内抛出的异常不会传播到主线程,需在
target函数里捕获或重写run()
真正需要并行计算时,绕不开 multiprocessing 或 concurrent.futures.ProcessPoolExecutor
只要任务是 CPU 密集型(如图像处理、加密、科学计算),必须用进程而非线程。注意:
-
multiprocessing中的函数必须能被序列化(不能是嵌套函数、lambda、类实例方法,除非用functools.partial包装) - 进程间通信比线程慢得多,频繁传大数据(如大数组)会成为瓶颈;此时应考虑
mmap或shared_memory(Python 3.8+) -
concurrent.futures.ProcessPoolExecutor比裸用multiprocessing.Process更简洁,推荐作为默认选择
多线程的“并发”和多进程的“并行”,底层机制完全不同;混淆这两者,是绝大多数性能问题的根源。
# python
# windows
# 大数据
# 字节
# win
# 为什么
# red
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
Android okhttputils现在进度显示实例代码
网站制作报价单模板图片,小松挖机官方网站报价?
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
C++时间戳转换成日期时间的步骤和示例代码
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
如何快速启动建站代理加盟业务?
七夕网站制作视频,七夕大促活动怎么报名?
怎么用AI帮你设计一套个性化的手机App图标?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
Laravel如何实现API版本控制_Laravel版本化API设计方案
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
如何快速使用云服务器搭建个人网站?
魔方云NAT建站如何实现端口转发?
如何快速搭建个人网站并优化SEO?
如何在云服务器上快速搭建个人网站?
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
Laravel如何生成API文档?(Swagger/OpenAPI教程)
如何将凡科建站内容保存为本地文件?
三星网站视频制作教程下载,三星w23网页如何全屏?
如何在云主机快速搭建网站站点?
做企业网站制作流程,企业网站制作基本流程有哪些?
如何用好域名打造高点击率的自主建站?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
phpredis提高消息队列的实时性方法(推荐)
如何在服务器上三步完成建站并提升流量?
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
C语言设计一个闪闪的圣诞树
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
如何正确下载安装西数主机建站助手?
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
Laravel怎么判断请求类型_Laravel Request isMethod用法
SQL查询语句优化的实用方法总结
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
如何获取PHP WAP自助建站系统源码?
Python数据仓库与ETL构建实战_Airflow调度流程详解
电商网站制作价格怎么算,网上拍卖流程以及规则?
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
Python文件异常处理策略_健壮性说明【指导】

