发布时间:2026/8/29 7:54:40
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/8/22 21:44:46

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

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

2026/8/28 20:24:47

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

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

2026/8/29 7:52:03

iFixAi开源审计器:让AI Agent任务完成度可量化、可验证

在 AI agent 从原型走向生产的过程中,最容易被低估的问题不是模型能力,而是“这个 agent 到底有没有把自己的活干完”。iFixAi 正是围绕这个问题出现的开源审计器:它不替 agent 做任务,而是检查 agent 的任务执行过程、工具调用结…

2026/8/29 7:52:03

笔记本本地LLM评测实战:选型、量化与Benchmark全流程

在笔记本上跑本地 LLM 并做 Benchmark:一次完整的评测思路与实战很多开发者第一次接触本地 LLM 时,都会陷入同一个纠结:我的电脑到底能不能跑?是不是必须要有顶配显卡才能玩?我见过太多人因为这个问题直接放弃了本地模…

2026/8/29 7:52:03

单细胞响应预测:迈向虚拟细胞的关键一步

近年来,单细胞测序技术让研究者能够看清细胞与细胞之间的差异,但“看清”并不等于“算准”。尤其在药物研发早期,我们迫切需要回答一个很难的问题:一种从未见过的药物,用在某种疾病细胞上,单细胞层面的转录…

2026/8/29 7:52:03

系统动力学建模解析全球塑料污染:从生命周期到干预策略

1. 问题背景:我们正被塑料淹没吗? 如果你在2020年初关注过国际大学生数学建模竞赛(ICM),那么对E题“Drowning in Plastic”这个标题一定印象深刻。这不仅仅是一个竞赛题目,它更像是一声尖锐的警钟&#xff…

2026/8/29 7:52:03

开源AI模型即基础设施:从选型到自部署运维实践

开源 AI 模型到底应该是什么?这个问题的答案直接决定了团队的技术选型、成本结构,甚至产品边界。工程界最近有一个很值得展开的判断:模型应该是基础设施,而不是设备。所谓设备,是指模型被封装成一个外部黑盒&#xff0…

2026/8/28 16:16:17

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/28 16:16:21

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/28 16:16:22

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/29 0:01:10

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

一、设置环境变量etc目录下的profile.d文件目录 /etc/profile.d1、编写 vi test.sh文件内容# jdk变量 export ZHK_HOME/root export PATH$PATH:$ZHK_HOME/test # 可以取出来ZHK_HOME变量给ZZZ_HOME赋值 export ZZZ_HOME${ZHK_HOME}/test2、刷新 执行source /etc/profile 命令使…

2026/8/29 0:01:10

【JavaScript】内存管理-垃圾回收机制-内存泄露

内存管理 C 语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()。 而 JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。 整…

2026/8/29 0:01:10

Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP 的目标是把 MCP(Model Context Protocol)能力延伸到真实嵌入式硬件实验室:AI Agent 通过一个标准化的 MCP Server,就能查看目标板状态、控制上电断电、复位开发板、读取串口日志,甚至执行镜像刷写。对于经…

2026/8/28 16:16:48

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/28 16:16:50

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/28 11:06:45

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…