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 请求、文件读写、数据库查询)→ threadingasyncio 都可,前者更简单

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 等资源,初始化必须放在子进程内部,不能靠父进程传入。


# python  # 字节  # ai 


相关栏目: 【 网站优化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脚手架快速实现登录注册功能