Day 25:【99天精通Python】多进程编程 - 榨干CPU的每一滴性能

Day 25:【99天精通Python】多进程编程 - 榨干CPU的每一滴性能

前言

欢迎来到第25天!

在昨天(多线程)的课程中,我们发现了一个令人沮丧的事实:由于 GIL(全局解释器锁)的存在,Python 的多线程在处理CPU密集型任务(如复杂的数学计算、视频转码、图像处理)时,并没有起到加速作用,甚至可能因为上下文切换而变得更慢。

今天,我们要打破这个枷锁。多进程 (Multiprocessing)允许我们启动多个独立的 Python 解释器进程。每个进程都有自己独立的 GIL 和内存空间,它们可以运行在不同的 CPU 核心上,真正实现并行计算

如果说多线程是"一个工厂里招了多个工人"(还是只有一个车间主任指挥),那么多进程就是"开了好几个分厂"。

本节内容:

  • 进程与线程的区别回顾
  • multiprocessing模块基础
  • 为什么必须写if __name__ == '__main__':
  • 进程间通信 (Queue)
  • 进程池 (Pool) 的高效使用
  • 实战练习:多核并行计算素数

一、多进程基础:Process 类

Python 的multiprocessing模块提供了与threading类似的 API,上手非常容易。

1.1 启动一个进程

importmultiprocessingimporttimeimportosdeftask(name):# os.getpid() 获取当前进程ID# os.getppid() 获取父进程IDprint(f"进程{name}启动 (PID:{os.getpid()}, 父PID:{os.getppid()})")time.sleep(2)print(f"进程{name}结束")if__name__=='__main__':print(f"主进程启动 (PID:{os.getpid()})")# 创建进程p=multiprocessing.Process(target=task,args=("Worker-1",))# 启动p.start()# 等待结束p.join()print("主进程结束")

1.2 重要:Windows 下的注意事项

在 Windows 上使用多进程,必须将启动代码放在if __name__ == '__main__':之下。
原因:Windows 创建进程时会导入父模块,如果不加保护,会导致无限递归创建进程,程序直接崩坏。


二、数据隔离:进程之间不共享全局变量

这是多进程与多线程最大的区别。每个进程都有自己独立的内存空间。

importmultiprocessing# 全局变量money=100defchange_money():globalmoney money=0print(f"子进程修改后的 money:{money}")if__name__=='__main__':p=multiprocessing.Process(target=change_money)p.start()p.join()print(f"主进程的 money:{money}")# 结果依然是 100!子进程改的是它自己那份拷贝。

三、进程间通信 (IPC)

既然内存不共享,那进程间怎么传递数据呢?最常用的方式是队列 (Queue)
注意:这里的 Queue 是multiprocessing.Queue,不是线程的queue.Queue

frommultiprocessingimportProcess,Queuedefproducer(q):print("生产者:放入数据...")q.put("Hello")q.put("World")defconsumer(q):print("消费者:准备取数据...")print(q.get())print(q.get())if__name__=='__main__':# 创建一个共享队列q=Queue()p1=Process(target=producer,args=(q,))p2=Process(target=consumer,args=(q,))p1.start()p2.start()p1.join()p2.join()

四、进程池 (Pool):批量管理进程

如果你有 100 个任务要处理,不可能启动 100 个进程(系统资源会耗尽)。通常我们会创建一个进程池,比如池子里有 4 个进程,它们轮流处理这 100 个任务。

4.1 使用 Pool.map (同步/简单)

frommultiprocessingimportPoolimporttimeimportosdefheavy_work(n):print(f"进程{os.getpid()}正在计算{n}^2")time.sleep(1)# 模拟耗时returnn*nif__name__=='__main__':# 创建包含 4 个进程的池# 默认不填则是 CPU 核心数withPool(4)asp:# map 会自动把任务分发给进程池,并收集结果results=p.map(heavy_work,range(10))print(f"计算结果:{results}")

4.2 使用 Pool.apply_async (异步/灵活)

如果不希望阻塞主进程,或者任务参数复杂,可以使用apply_async

if__name__=='__main__':p=Pool(4)results=[]foriinrange(5):# 异步提交任务,返回一个 result 对象res=p.apply_async(heavy_work,args=(i,))results.append(res)p.close()# 禁止再提交新任务p.join()# 等待所有任务完成# 获取结果final_values=[res.get()forresinresults]print(final_values)

五、实战练习:多进程计算素数

让我们看看多进程在 CPU 密集型任务上到底有多强。
任务:计算 1 到 100,000 之间所有素数的个数。

importtimefrommultiprocessingimportPool,cpu_countdefis_prime(n):ifn<=1:returnFalseforiinrange(2,int(n**0.5)+1):ifn%i==0:returnFalsereturnTruedefcount_primes(start,end):count=0foriinrange(start,end):ifis_prime(i):count+=1returncountif__name__=='__main__':# 任务范围TOTAL_NUMS=200000# --- 单进程版本 ---start_t=time.time()result=count_primes(1,TOTAL_NUMS)print(f"单进程耗时:{time.time()-start_t:.2f}s, 结果:{result}")# --- 多进程版本 ---start_t=time.time()# 将任务拆分成 4 份 (假设 CPU 是 4 核)pool_size=4step=TOTAL_NUMS//pool_size ranges=[]foriinrange(pool_size):start=1+i*step end=1+(i+1)*step ranges.append((start,end))# ranges = [(1, 50000), (50001, 100000), ...]withPool(pool_size)asp:# starmap 支持传多个参数results=p.starmap(count_primes,ranges)total=sum(results)print(f"多进程耗时:{time.time()-start_t:.2f}s, 结果:{total}")

预期结果
在多核 CPU 上,多进程版本的速度通常是单进程的 2-4 倍(取决于核心数)。


六、常见问题

Q1:进程是不是越多越好?

不是。

  1. 开销大:创建和销毁进程比线程消耗大得多。
  2. 上下文切换:如果进程数超过 CPU 核心数太多,CPU 就要频繁在进程间切换,反而降低效率。
    最佳实践:进程池大小通常设置为cpu_count()cpu_count() + 1

Q2:进程间通信还有其他方式吗?

除了Queue,还有Pipe(管道,适合两个进程通信)、Manager(可以创建共享的列表、字典,但速度较慢)。


七、小结

多进程 Multiprocessing

Process 类

数据隔离

进程池 Pool

Process(target=...)

start() / join()

全局变量不共享

通信: Queue

Pool(processes=4)

map / starmap (批量)

apply_async (异步)

关键要点

  1. CPU 密集型任务(计算)首选多进程
  2. I/O 密集型任务(网络)首选多线程
  3. 多进程必须注意if __name__ == '__main__':保护。
  4. 进程间数据默认隔离,需通过Queue传递。

八、课后作业

  1. 文件搜索:编写一个多进程程序,在指定的文件夹(包含大量子文件夹)中搜索包含特定关键词的所有.txt文件。主进程负责汇总所有找到的文件路径。
  2. 图片缩略图生成:假设有一个文件夹里有 100 张高清大图。编写程序使用Process Pool并行地将它们缩小为 100x100 的缩略图。(提示:可以使用Pillow库处理图片,需先pip install pillow)。
  3. 多进程进度条:尝试实现一个功能,主进程显示一个总进度条,反映后台多个进程任务的整体完成情况(使用QueueManager传递进度)。

下节预告

Day 26:网络编程入门 (Socket)- 玩转了单机并发,接下来我们要跨越网络,让两台电脑互相聊天!


系列导航

  • 上一篇:Day 24 - 多线程编程
  • 下一篇:Day 26 - 网络编程入门(待更新)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1150818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日面试题分享132:什么是Vue中的slot?它的作用是什么?

slot是插槽&#xff0c;是Vue中的占位符&#xff0c;可以通过slot标签向组件内部插入内容。父组件可以在使用子组件时&#xff0c;使用ChildComponent标签向子组件内部插入内容&#xff0c;插入内容会被渲染在子组件slot标签位置。

SCAU期末笔记 - 计算机网络雨课堂习题整理

我以为只有PDF题库的 怎么还有个雨课堂习题要复 算了算了开始整理吧一百多道题我搞不动了&#xff0c;主要精力还是准备留给pdf题库&#xff0c;这个就全靠豆包大人发力了 1.多选题 计算机网络的时延由&#xff08; &#xff09;组成。A.传播时延B.发送时延C.排队时延D.处理时延…

每日面试题分享133:在Vue模版渲染时,如何保留HTML注释?

在Vue中&#xff0c;默认情况下在渲染过程中会移除模版中的HTML注释。保留方法&#xff1a; 1.使用comments选项&#xff08;Vue2&#xff09;在组件选项中设置comments&#xff1a;true。2.使用v-pre在需要保留注释的标签上使用v-pre。3.使用特殊注释语法&#xff08;Vue3&…

ES数据库节点故障处理:实战案例详解

ES数据库节点故障处理&#xff1a;一次真实线上事故的深度复盘凌晨两点&#xff0c;手机突然震动——监控平台弹出一条红色告警&#xff1a;“Elasticsearch 集群状态变为 red&#xff0c;多个索引写入失败”。这不是演习&#xff0c;而是一家金融公司日志系统的实战现场。作为…

Java SpringBoot+Vue3+MyBatis 中小型医院网站系统源码|前后端分离+MySQL数据库

摘要 随着信息技术的快速发展&#xff0c;医疗行业正逐步向数字化、智能化转型。中小型医院作为医疗服务体系的重要组成部分&#xff0c;亟需通过信息化手段提升管理效率和服务质量。传统医院管理系统存在功能单一、扩展性差、用户体验不佳等问题&#xff0c;难以满足现代医疗服…

谷歌商家中心 (Google Merchant Center) VS 产品数据 Feed 新手指南 VS 结构化数据Schmea

Google Merchant Center&#xff08;GMC&#xff09;和产品数据Feed是外贸电商提升谷歌曝光的关键工具。GMC作为产品数字总部&#xff0c;管理产品信息并实现自动广告投放&#xff1b;而产品数据Feed则是结构化产品信息&#xff0c;帮助谷歌精准展示商品。本文详解GMC三大优势&…

Day 26:【99天精通Python】网络编程入门 (Socket) - 让电脑互相“打电话“

Day 26&#xff1a;【99天精通Python】网络编程入门 (Socket) - 让电脑互相"打电话" 前言 欢迎来到第26天&#xff01; 在此之前&#xff0c;我们的程序都只是在自己的电脑上自言自语&#xff08;单机版&#xff09;。但互联网的魅力在于互联互通。通过网络编程&…

SpringBoot+Vue 桂林旅游景点导游平台平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

摘要 随着旅游业的快速发展&#xff0c;信息化管理成为提升旅游服务质量的重要手段。桂林作为世界著名的旅游城市&#xff0c;拥有丰富的自然和文化景观&#xff0c;但传统的旅游服务模式存在信息不对称、导览效率低等问题。游客在规划行程时往往需要依赖纸质地图或第三方平台&…

⚡_实时系统性能优化:从毫秒到微秒的突破[20260112171643]

作为一名专注于实时系统性能优化的工程师&#xff0c;我在过去的项目中积累了丰富的低延迟优化经验。实时系统对性能的要求极其严格&#xff0c;任何微小的延迟都可能影响系统的正确性和用户体验。今天我要分享的是在实时系统中实现从毫秒到微秒级性能突破的实战经验。 &#…

【毕业设计】SpringBoot+Vue+MySQL 网站平台源码+数据库+论文+部署文档

摘要 随着互联网技术的飞速发展&#xff0c;信息化管理平台在各行各业中的应用越来越广泛。传统的纸质化管理方式效率低下&#xff0c;难以满足现代高效办公的需求。基于Web的在线平台能够实现信息的快速传递和共享&#xff0c;提高工作效率。特别是在教育、企业管理和公共服务…

Packet Tracer运行环境配置全面讲解

手把手教你搞定 Cisco Packet Tracer 运行环境&#xff1a;从下载到稳定运行的完整实战指南 你有没有遇到过这样的情况&#xff1f;兴致勃勃地打开网络课作业&#xff0c;准备用 Cisco Packet Tracer 做个路由实验&#xff0c;结果双击图标——黑屏、闪退、弹窗报错&#xf…

Day 27:【99天精通Python】HTTP协议与Requests库 - 爬虫与API的敲门砖

Day 27&#xff1a;【99天精通Python】HTTP协议与Requests库 - 爬虫与API的敲门砖 前言 欢迎来到第27天&#xff01; 在昨天的课程中&#xff0c;我们用 Socket 写了一个简易的聊天程序。虽然很酷&#xff0c;但你有没有发现&#xff1a;为了发一句 “Hello”&#xff0c;我们写…

每日一个C++知识点|const 和 constexpr 的区别

在程序开发中&#xff0c;由于代码复杂度大或者程序员的疏忽&#xff0c;以及函数参数传递中的无意识修改&#xff0c;都会导致数据意外修改的风险。为了解决这个问题&#xff0c;出现了类型限定符。其中&#xff0c;C的主要类型限定符是 const 和 constexpr 两种。 那么 const…

什么是天猫国际品牌代理运营?一般代运营提供哪些服务?

在全球化电商浪潮的推动下&#xff0c;天猫国际平台成为众多海外品牌进入中国市场的重要通道。然而&#xff0c;海外品牌在进入中国市场时&#xff0c;往往面临着文化差异、运营规则不熟悉、市场推广困难等诸多挑战。天猫国际品牌代理运营作为一种专业的电商服务模式&#xff0…

screen命令在断网环境下的调试应用操作指南

断网不断程&#xff1a;用screen构建高可用远程调试环境你有没有过这样的经历&#xff1f;深夜正在远程烧录固件&#xff0c;眼看着进度条走到 90%&#xff0c;突然 Wi-Fi 切换、4G 信号丢失&#xff0c;SSH 连接一断&#xff0c;终端里的任务瞬间“消失”。刷新会话后发现&…

[特殊字符]_Web框架性能终极对决:谁才是真正的速度王者[20260112172541]

作为一名拥有10年开发经验的全栈工程师&#xff0c;我经历过无数Web框架的兴衰更替。从早期的jQuery时代到现在的Rust高性能框架&#xff0c;我见证了Web开发技术的飞速发展。今天我要分享一个让我震惊的性能对比测试&#xff0c;这个测试结果彻底改变了我对Web框架性能的认知。…

超详细版LVGL教程:从零实现家居主界面

从零打造一个智能家居主界面&#xff1a;LVGL实战全记录最近在做一个家庭中控屏的项目&#xff0c;客户想要一块能控制全屋灯光、空调和安防系统的触摸面板。这事儿听起来简单&#xff0c;但真上手才发现——图形界面这东西&#xff0c;不光是“画几个按钮”那么简单。尤其是用…

深耕香港会计服务领域 香港卓信会计打造企业注册一站式解决方案

作为连接内地与国际市场的核心枢纽&#xff0c;香港凭借国际化金融环境与规范化商业体系&#xff0c;成为企业出海布局的重要据点。在此背景下&#xff0c;深耕香港财税服务领域的卓信会计服务有限公司&#xff08;ZHUOXIN ACCOUNTING SERVICE LIMITED&#xff09;凭借扎实的合…

RealMem: 重新定义AI的“长期记忆”,挑战真实场景交互

AI Agent 真的准备好成为你的长期合作伙伴了吗&#xff1f;你有没有这样的经历&#xff1a;在使用chatgpt等AI Assistant时&#xff0c;不断进行这两种动作&#xff1a;“新建聊天页”和“寻找过去的某个聊天页继续问”。为什么需要新建聊天页&#xff1f;因为一个会话上下文太…

天猫TP公司是什么意思?一般提供哪些服务?

在电商行业的发展进程中&#xff0c;天猫平台作为国内领先的电商巨头&#xff0c;吸引了众多品牌和商家的入驻。为了帮助品牌方更好地运营天猫店铺&#xff0c;提高店铺的竞争力和业绩&#xff0c;天猫TP公司应运而生。天猫TP公司凭借其专业的运营能力和丰富的资源优势&#xf…