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 连接并响应 → threadingmultiprocessing 启动快、内存开销小
  • 需要共享内存对象(如 dictlist)且不涉及复杂同步 → threading 可直接引用,multiprocessing 需用 ManagerQueue
  • 避免 multiprocessing 在 Windows 上反复导入主模块的问题

threading.Thread 启动后不执行?常见卡点

最常被忽略的是没调用 start(),而是误调了 run() —— 后者只是普通函数调用,仍在主线程同步执行。

import threading
import time

def 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()

真正需要并行计算时,绕不开 multiprocessingconcurrent.futures.ProcessPoolExecutor

只要任务是 CPU 密集型(如图像处理、加密、科学计算),必须用进程而非线程。注意:

  • multiprocessing 中的函数必须能被序列化(不能是嵌套函数、lambda、类实例方法,除非用 functools.partial 包装)
  • 进程间通信比线程慢得多,频繁传大数据(如大数组)会成为瓶颈;此时应考虑 mmapshared_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文件异常处理策略_健壮性说明【指导】