Python 多进程与多线程性能对比
发布时间 - 2026-01-26 00:00:00 点击率:次多进程适合CPU密集型任务,因GIL限制多线程无法提升Python的CPU性能;I/O密集型可用threading或asyncio;混合场景应拆分处理,避免GIL与阻塞互相拖累。
多进程适合 CPU 密集型任务,多线程在 Python 里几乎不提升 CPU 性能
这是由 GIL(全局解释器锁)决定的:CPython 中同一时刻只有一个线程能执行 Python 字节码。所以即使开了 10 个 threading.Thread 做数值计算,实际仍是串行执行,还多了线程切换开销。
常见错误现象:time.time() 测出来多线程比单线程还慢;top 或任务管理器显示 CPU 占用率始终卡在 100%(单核),而不是接近 N×100%。
适用场景:
- CPU 密集型(如科学计算、图像处理、加密解密)→ 用
multiprocessing - I/O 密集型(如 HTTP 请求、文件读写、数据库查询)→
threading或asyncio都可,前者更简单
multiprocessing.Pool 比手动创建 Process 更省心也更高效
直接用 Process 启动几十个子进程容易失控:进程生命周期难管理、结果收集要自己搞共享内存或队列、异常传播困难。而 Pool 封装了进程复用、任务分发、结果聚合和错误回传。
实操建议:
- 用
pool.map(func, iterable)替代循环调用Process(target=func, args=(x,)) - 注意
iterable会被序列化(pickle),不能传 lambda、嵌套函数、带绑定方法的对象 - 默认进程数是
os.cpu_count(),CPU 密集任务别盲目设更大值,反而因调度开销拖慢整体
线程池 concurrent.futures.ThreadPoolExecutor 是 I/O 任务的首选
相比原始 threading 模块,它自动管理线程生命周期、支持 as_completed 和超时控制,且 API 与 ProcessPoolExecutor 一

典型误用:
- 用
ThreadPoolExecutor跑纯计算(比如sum([i**2 for i in range(10**6)]))→ 白忙活,GIL 锁死 - 忘记调用
shutdown(wait=True)或没用with上下文 → 程序可能提前退出,任务被丢弃 - 提交太多任务到线程池(比如 10000 个 HTTP 请求)→ 不是线程越多越快,通常 10–50 个线程就足够压满网络带宽
混合场景:I/O + CPU 拆开做,别让 GIL 和阻塞互相拖累
比如“下载图片 → 缩略图处理”这种组合任务,不能全扔给线程(缩略图卡 GIL),也不能全扔给进程(下载部分启动开销大、上下文切换重)。
推荐做法:
- 用
ThreadPoolExecutor下载一批图片(I/O 并发) - 把下载完的本地路径列表交给
ProcessPoolExecutor批量做缩略图(CPU 并发) - 避免跨进程传递原始图片二进制数据,改传文件路径——减少 pickle 开销和内存拷贝
最容易被忽略的是:子进程无法继承主线程的 TLS(线程局部存储)、数据库连接、日志 handler 等资源,初始化必须放在子进程内部,不能靠父进程传入。
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
Mybatis 中的insertOrUpdate操作
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
如何用VPS主机快速搭建个人网站?
*服务器网站为何频现安全漏洞?
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
Android使用GridView实现日历的简单功能
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
如何在阿里云通过域名搭建网站?
网站建设保证美观性,需要考虑的几点问题!
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
浅谈javascript alert和confirm的美化
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
微信小程序 canvas开发实例及注意事项
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
如何确认建站备案号应放置的具体位置?
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
Laravel如何使用Telescope进行调试?(安装和使用教程)
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
利用 Google AI 进行 YouTube 视频 SEO 描述优化
如何在新浪SAE免费搭建个人博客?
如何用虚拟主机快速搭建网站?详细步骤解析
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
济南网站建设制作公司,室内设计网站一般都有哪些功能?
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
图册素材网站设计制作软件,图册的导出方式有几种?
jQuery 常见小例汇总
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
QQ浏览器网页版登录入口 个人中心在线进入
如何在万网ECS上快速搭建专属网站?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何用西部建站助手快速创建专业网站?
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
Laravel如何生成API文档?(Swagger/OpenAPI教程)
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能

