讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在Python中通过multiprocessing利用多核CPU提升计算性能?

轻晨小哥_7402

轻晨小哥_7402

发布时间:2026-08-03 07:06:39

|

152人浏览过

|

来源于php中文网

原创

multiprocessing 能真正提升 CPU 密集型任务性能,但需满足:任务纯计算无 I/O、输入可分片、函数可序列化、避免共享状态与大对象传递,并正确管理进程生命周期。

如何在python中通过multiprocessing利用多核cpu提升计算性能?

multiprocessing 能真正提升 CPU 密集型任务的性能,但前提是选对组件、避开常见陷阱——盲目套用反而拖慢程序。

什么时候必须用 multiprocessing 而不是 threading

只在任务明显卡在 CPU 计算上时才用:multiprocessing。比如跑 numpy 矩阵运算、遍历大列表做数值计算、调用纯 Python 的循环逻辑。

常见错误现象:用 threading.Thread 处理 100 万个数字求和,耗时几乎和单线程一样——这就是 GIL 在锁死线程并发。

  • CPU 使用率持续 >80%,而 I/O 等待时间极短(可用 psutil.cpu_percent() 和 psutil.disk_io_counters() 验证)
  • 函数内部不涉及太多文件读写、网络请求或数据库查询
  • 输入数据可分片、结果可合并(如 map-reduce 模式)

Pool.map() 是最常用也最容易出错的入口

它适合“一批独立输入 → 一批独立输出”的场景,比如批量处理图像、计算多个独立区间的积分、解析一堆 JSON 文件。

立即学习“Python免费学习笔记(深入)”;

容易踩的坑:

  • 传入的函数不能是嵌套函数或 lambda —— Pool 会 pickle 函数,而嵌套函数无法被序列化
  • 默认使用 spawn 启动方式(macOS/Linux)或 spawn/fork(Linux),Windows 只支持 spawn,所以务必保证 if __name__ == "__main__": 包裹主逻辑
  • 不要在 map() 里传巨大对象(如 GB 级 DataFrame)——进程间拷贝开销远超计算收益;应只传路径、ID 或轻量参数,让子进程自己加载

示例正确写法:

python-script-generator
python-script-generator

快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。

下载
from multiprocessing import Pool
import os
<p>def process_chunk(chunk_id):</p><h1>子进程自己读数据,避免主进程传递大数据</h1><pre class="brush:php;toolbar:false;">data = load_data_by_id(chunk_id)  # 实际中替换成 pd.read_csv 或类似
return data.sum()

if name == "main": chunk_ids = [1, 2, 3, 4] with Pool(os.cpu_count()) as pool: results = pool.map(process_chunk, chunk_ids)

Manager 共享状态时性能损耗比你想象的更大

当你需要多个进程往同一个列表追加结果、或动态更新计数器时,Manager.list() 或 Manager.dict() 看似方便,但背后是跨进程 RPC 调用,延迟高、吞吐低。

真实影响:

  • 每调用一次 shared_list.append(x),实际触发一次 IPC(进程间通信),比内存操作慢 100 倍以上
  • 不适合高频写入场景(如每毫秒更新一次的统计)
  • 更适合“少量协调 + 大量独立计算”,比如记录各进程完成状态、汇总最终指标

更高效的做法:让每个进程返回局部结果,主进程最后合并。例如:

# ❌ 低效
shared = manager.list()
for i in range(4):
    p = Process(target=worker, args=(shared,))
    p.start()
<h1>✅ 推荐</h1><p>results = pool.map(worker_no_shared, task_list)  # 各自返回 list,主进程 sum()
final_result = sum(results)

启动方式与资源泄漏风险

默认 Pool 或 Process 使用 spawn 启动,安全但启动稍慢;Linux 下可设 fork 加速,但有内存继承风险(如已初始化的数据库连接、全局缓存可能被复制后引发冲突)。

关键点:

  • 永远用 with Pool() as pool: 或显式调用 pool.close(); pool.join(),否则子进程可能残留成僵尸进程
  • 避免在子进程中再创建新 Pool(嵌套并行),极易触发资源竞争或递归爆炸
  • 如果任务含 C 扩展(如 cv2、torch),注意某些库在 spawn 下需重新 import,否则报 ModuleNotFoundError

复杂点在于:没有“通用最优配置”。CPU 核心数不等于最佳进程数——有时 os.cpu_count() - 1 更稳,尤其当机器还跑着其他服务时。

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1671

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4204

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1669

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

24397

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2987

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3007

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1163

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn