Python 多进程模块全面指南

发布时间:2026/10/24 7:18:43

Python 多进程模块全面指南 一、为什么需要多进程Python 由于GIL全局解释器锁的限制多线程无法充分利用多核 CPU。多进程可以✅ 绕过 GIL 限制实现真正的并行计算✅ 适合 CPU 密集型任务科学计算、图像处理等✅ 提高程序整体吞吐量二、核心组件概览组件作用Process创建单个进程Pool进程池批量管理进程Queue进程间通信队列Pipe双向管道通信Value/Array共享内存Manager共享服务器支持多种数据结构Lock/Semaphore进程同步三、Process 类详解3.1 基本使用frommultiprocessingimportProcessimportosimporttimedefworker(name):子进程执行的任务print(f子进程{name}启动PID:{os.getpid()})time.sleep(2)print(f子进程{name}结束)if__name____main__:# Windows 必须加这行print(f主进程 PID:{os.getpid()})# 创建进程pProcess(targetworker,args(A,))p.start()# 启动进程p.join()# 等待进程结束print(主进程结束)3.2 常用属性和方法pProcess(targetfunc,nameWorker-1,daemonTrue)# 属性p.name# 进程名p.pid# 进程IDp.is_alive()# 是否存活p.daemon# 是否为守护进程# 方法p.start()# 启动进程p.join()# 阻塞等待p.terminate()# 强制终止3.3 继承 Process 类classMyProcess(Process):def__init__(self,name):super().__init__()self.namenamedefrun(self):# 必须实现 run 方法print(f自定义进程{self.name}运行中)if__name____main__:pMyProcess(Test)p.start()p.join()四、进程池 Pool4.1 基本用法frommultiprocessingimportPoolimporttimedeftask(x):time.sleep(1)returnx*xif__name____main__:# 创建包含4个进程的进程池withPool(processes4)aspool:# map: 阻塞式返回结果列表resultpool.map(task,range(10))print(fmap 结果:{result})# imap: 惰性求值返回迭代器forresinpool.imap(task,range(5)):print(fimap 结果:{res})# apply_async: 异步执行async_resultpool.apply_async(task,(20,))print(fasync 结果:{async_result.get()})4.2 Pool 常用方法对比方法特点适用场景map()阻塞有序需要全部结果imap()惰性有序大数据集节省内存imap_unordered()惰性无序不关心顺序apply()同步单任务调试apply_async()异步回调处理4.3 回调函数defcallback_func(result):print(f任务完成结果:{result})deferror_callback(err):print(f任务出错:{err})withPool(3)aspool:pool.apply_async(task,args(5,),callbackcallback_func,error_callbackerror_callback)pool.close()# 关闭进程池不再接受新任务pool.join()# 等待所有进程完成五、进程间通信5.1 Queue最常用frommultiprocessingimportProcess,Queuedefproducer(q):foriinrange(5):q.put(f产品{i})print(f生产: 产品{i})defconsumer(q):whileTrue:itemq.get()ifitemisNone:# 结束信号breakprint(f消费:{item})if__name____main__:qQueue(maxsize10)# 设置队列大小p1Process(targetproducer,args(q,))p2Process(targetconsumer,args(q,))p1.start()p2.start()p1.join()q.put(None)# 发送结束信号p2.join()5.2 Pipe双向通信frommultiprocessingimportProcess,Pipedefsender(conn):conn.send([Hello,World])conn.close()defreceiver(conn):msgconn.recv()print(f收到消息:{msg})if__name____main__:parent_conn,child_connPipe()p1Process(targetsender,args(child_conn,))p2Process(targetreceiver,args(parent_conn,))p1.start()p2.start()p1.join()p2.join()5.3 共享内存Value/ArrayfrommultiprocessingimportProcess,Value,Arraydefincrement(counter,arr):withcounter.get_lock():# 自动加锁counter.value1foriinrange(len(arr)):arr[i]1if__name____main__:# i 表示整数d 表示双精度浮点数counterValue(i,0)arrArray(d,[1.0,2.0,3.0])processes[Process(targetincrement,args(counter,arr))for_inrange(3)]forpinprocesses:p.start()forpinprocesses:p.join()print(fCounter:{counter.value})# 3print(fArray:{list(arr)})# [4.0, 5.0, 6.0]5.4 Manager最灵活frommultiprocessingimportProcess,Managerdefworker(d,l,v):d[key]valuel.append(1)v.value1if__name____main__:withManager()asmanager:shared_dictmanager.dict()shared_listmanager.list()shared_valmanager.Value(i,0)processes[Process(targetworker,args(shared_dict,shared_list,shared_val))for_inrange(3)]forpinprocesses:p.start()forpinprocesses:p.join()print(dict(shared_dict))# {key: value}print(list(shared_list))# [1, 1, 1]print(shared_val.value)# 3六、进程同步6.1 Lock互斥锁frommultiprocessingimportProcess,Lockimportsysdefsafe_print(lock,text):withlock:# 自动获取和释放锁sys.stdout.write(text\n)if__name____main__:lockLock()processes[Process(targetsafe_print,args(lock,f进程{i}))foriinrange(5)]forpinprocesses:p.start()forpinprocesses:p.join()6.2 Semaphore信号量frommultiprocessingimportProcess,Semaphoreimporttimedefaccess_resource(sem,worker_id):sem.acquire()try:print(f工人{worker_id}获得资源)time.sleep(2)finally:sem.release()if__name____main__:semSemaphore(3)# 最多3个进程同时访问processes[Process(targetaccess_resource,args(sem,i))foriinrange(10)]forpinprocesses:p.start()七、实际应用案例案例1并行文件处理frommultiprocessingimportPool,cpu_countimportosdefprocess_file(filepath):处理单个文件sizeos.path.getsize(filepath)# 模拟处理returnfilepath,sizedefbatch_process_files(file_list):并行处理文件列表withPool(min(cpu_count(),len(file_list)))aspool:resultspool.map(process_file,file_list)returndict(results)if__name____main__:files[file1.txt,file2.txt,file3.txt]sizesbatch_process_files(files)print(sizes)案例2生产者-消费者模式frommultiprocessingimportProcess,Queue,JoinableQueueimporttimeclassProducer(Process):def__init__(self,queue,items):super().__init__()self.queuequeue self.itemsitemsdefrun(self):foriteminself.items:self.queue.put(item)print(f生产:{item})time.sleep(0.5)self.queue.put(None)# 结束信号classConsumer(Process):def__init__(self,queue):super().__init__()self.queuequeuedefrun(self):whileTrue:itemself.queue.get()ifitemisNone:breakprint(f消费:{item})self.queue.task_done()if__name____main__:queueJoinableQueue()itemsrange(5)producerProducer(queue,items)consumerConsumer(queue)producer.start()consumer.start()producer.join()queue.join()# 等待队列中所有任务完成consumer.join()八、常见陷阱与最佳实践❌ 常见错误# 错误1Windows 下忘记 if __name__Process(targetfunc).start()# 会导致无限递归# 错误2在子进程中修改全局变量global_var0deffunc():globalglobal_var global_var1# 不会影响主进程的变量# 错误3使用不可序列化的对象pool.map(lambdax:x1,[open(file.txt)])# 文件对象不可序列化✅ 最佳实践# 1. 使用 if __name__ __main__if__name____main__:main()# 2. 控制进程数量cpu_numos.cpu_count()pool_sizemin(cpu_num,8)# 通常不超过CPU核心数# 3. 及时清理资源withPool()aspool:# 自动调用 close() 和 join()pass# 4. 使用 imap 处理大数据forresultinpool.imap(task,huge_list,chunksize100):process_result(result)# 5. 异常处理try:resultpool.apply_async(risky_task,(data,)).get(timeout10)exceptTimeoutError:print(任务超时)exceptExceptionase:print(f任务失败:{e})九、性能对比建议场景推荐方案CPU 密集型多进程 (Process/Pool)IO 密集型多线程 (threading) 或 asyncio少量任务Process批量任务Pool简单通信Queue复杂共享数据Manager高性能计算multiprocessing numpy十、总结Process适合少量独立任务Pool适合批量并行处理Queue/Pipe用于进程通信Manager提供灵活的共享数据Lock/Semaphore确保数据安全注意 Windows 下的__main__保护进程数通常不超过 CPU 核心数
延伸阅读

更多相关文章

2026/10/22 19:32:56

多轨 AI 音乐分离与混音:从单轨输出到多声部混合的控制参数

多轨 AI 音乐分离与混音:从单轨输出到多声部混合的控制参数 一、AI 生成的音乐听起来像一锅粥——所有乐器混在一起 当前 AI 音乐生成模型(如 Suno、Udio)的默认输出是一个混合音频文件——所有声部(人声、鼓组、贝斯、键盘&#…

2026/10/24 3:40:15

浏览器端LLM部署:基于Ratchet的Moondream模型实现方案

浏览器端LLM部署:基于Ratchet的Moondream模型实现方案 【免费下载链接】ratchet A cross-platform browser ML framework. 项目地址: https://gitcode.com/gh_mirrors/ratche/ratchet Ratchet是一个跨平台浏览器机器学习框架,能让开发者在浏览器环…

2026/10/24 8:18:45

MATLAB相关性分析建模:从皮尔逊到偏相关与滚动诊断

简介:本资源是一套面向数学建模初学者与MATLAB入门者的相关性分析实战教学包,聚焦变量间关联性度量这一建模关键环节,适用于课程设计、竞赛备赛及科研数据预处理场景。压缩包共11个文件(194KB),含3个Excel体…

2026/10/24 8:18:45

主流MQ产品对比:RabbitMQ、ActiveMQ、RocketMQ与Kafka

1. 主流MQ产品横向对比指南作为分布式系统架构的核心组件,消息队列(MQ)技术选型直接影响着系统的可靠性、扩展性和开发效率。从业十年间,我参与过从传统金融到互联网电商的多个项目,深刻体会到不同MQ产品的适用场景差异…

2026/10/24 8:18:45

智能家居控制系统搭建指南

由于您提供的输入内容为空(项目标题、项目正文、关键词和摘要描述均为空),我无法基于空信息生成符合要求的专业博文。根据创作规范,所有输出必须严格基于用户提供的具体内容展开。建议您补充以下至少一项信息:明确的项…

2026/10/24 8:18:45

工业故障诊断框架:样本不平衡、物理约束与边缘实时部署实践

1. 工业故障诊断的真实困境与框架设计初衷1.1 为什么工业场景下的故障诊断这么难做干过工业设备监测的人都有一个共同感受:实验室里跑得通的方法,到了产线上往往活不过三天。原因不复杂,工业现场的数据分布和学术数据集完全是两回事。学术数据…

2026/10/24 8:13:45

YimMenu快速教程:菜单唤出、中文设置与防护调优一次讲清

YimMenu快速教程:菜单唤出、中文设置与防护调优一次讲清 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/Yi…

2026/10/23 22:56:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/24 0:02:40

MATLAB缩进快捷键与批量格式化实战指南

1. 被自动缩进折磨的那些年如果你写过MATLAB代码,大概率经历过这种场景:从某个文档、网页或者聊天记录里复制了一段代码,粘贴进编辑器之后,每一行前面都带着莫名其妙的空格,有的行首是四个空格,有的是一个T…

2026/10/24 0:02:40

用Poco实现Qt风格信号与槽的跨平台C++方案

简介:本资源是一份面向C中级开发者的技术实践工程,聚焦于在非Qt框架环境下模拟实现Qt核心通信机制——信号与槽,借助Poco网络库的事件系统完成解耦式对象通信。适用于需在跨平台C项目中引入松耦合回调机制、但受限于无法集成Qt依赖的开发场景…

2026/10/24 0:02:40

ESXi裸机虚拟化安装指南:从硬件兼容到虚拟机部署

1. 为什么还要折腾ESXi:从一台闲置机器说起手里攒了几台淘汰下来的迷你主机,配置不算差,i5加16G内存,扔了可惜,装个桌面系统又觉得浪费。这种场景下,ESXi就成了一个绕不开的选择。它是一套裸机虚拟化平台&a…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑