当前位置: 首页 > news >正文

Python 进阶【二】:多进程编程

一、什么是进程?

  • 进程(Process):操作系统分配资源的最小单位。每个运行中的程序就是一个进程。
  • 线程(Thread):进程内最小的执行单元,可看作轻量级进程。

💡 Python 的多线程受 GIL 限制,在 CPU 密集型任务中难以实现真正的并行。多进程是绕过 GIL、充分利用多核 CPU 的推荐方式。


二、基础用法:multiprocessing.Process

1. 创建进程

from multiprocessing import Process
import os, timedef task():time.sleep(2)print('子进程ID:', os.getpid())if __name__ == '__main__':print('主进程ID:', os.getpid())processes = []for _ in range(10):p = Process(target=task)p.start()processes.append(p)for p in processes:p.join()

2. 常用参数和方法

属性 / 方法说明
target执行函数
args / kwargs传参
start()启动进程
join(timeout)阻塞等待
is_alive()是否仍在运行
terminate()终止进程
daemon设置是否为守护进程
pid / exitcode进程 ID / 退出码

三、进程池:multiprocessing.Pool

1. 创建进程池并提交任务

from multiprocessing import Pool
import timedef task(name):time.sleep(2)print(f"{name} 执行完毕")if __name__ == '__main__':pool = Pool(processes=4)for i in range(6):pool.apply_async(task, args=(f"任务{i}",))  # 非阻塞方式pool.close()pool.join()

2. 方法说明

方法描述
apply()阻塞提交
apply_async()非阻塞提交,支持回调函数
close() / join()关闭进程池 / 等待结束

四、进程间通信

1. 使用 Pipe(管道)

from multiprocessing import Pipe, Processdef send_data(conn, data):conn.send(data)def receive_data(conn):print(conn.recv())if __name__ == '__main__':conn1, conn2 = Pipe()Process(target=send_data, args=(conn1, 'Hello')).start()Process(target=receive_data, args=(conn2,)).start()

2. 使用 Queue(队列)

from multiprocessing import Queue, Processdef set_data(q, val):q.put(val)def get_data(q):print(q.get())if __name__ == '__main__':q = Queue()Process(target=set_data, args=(q, '数据')).start()Process(target=get_data, args=(q,)).start()

五、进程同步(锁)

1. 不加锁的输出(可能混乱)

from multiprocessing import Process
import os, timedef task():print(f"{os.getpid()} start")time.sleep(2)print(f"{os.getpid()} end")for _ in range(3):Process(target=task).start()

2. 加锁保证输出顺序

from multiprocessing import Process, Lock
import os, timedef task(lock):with lock:print(f"{os.getpid()} start")time.sleep(2)print(f"{os.getpid()} end")if __name__ == '__main__':lock = Lock()for _ in range(3):Process(target=task, args=(lock,)).start()

六、共享状态

1. 使用共享内存:ValueArray

from multiprocessing import Process, Value, Arraydef modify(shared_num, shared_arr):shared_num.value = 100.5for i in range(len(shared_arr)):shared_arr[i] = -shared_arr[i]if __name__ == '__main__':num = Value('d', 0.0)arr = Array('i', range(5))p = Process(target=modify, args=(num, arr))p.start()p.join()print(num.value)print(arr[:])

2. 使用 Manager 提供的共享对象

from multiprocessing import Process, Managerdef modify(shared_dict, shared_list):shared_dict[1] = '一'shared_list.reverse()if __name__ == '__main__':with Manager() as manager:d = manager.dict()l = manager.list(range(5))p = Process(target=modify, args=(d, l))p.start()p.join()print(d)print(l)

七、实战总结

应用场景推荐方案原因说明
CPU 密集型任务多进程绕过 GIL,真正多核并行
I/O 密集型任务多线程 / 协程利用线程或异步释放等待时间
多任务并发管理进程池(Pool)简化进程创建与调度,避免资源浪费
多进程通信Pipe / Queue实现进程间数据传输
状态共享Value / Array / Manager灵活、安全地在进程间共享数据

八、推荐阅读

  • 📚 官方文档:multiprocessing — Process-based parallelism
http://www.xdnf.cn/news/691147.html

相关文章:

  • TCP三次握手/四次握手-TCP/IP四层模型-SSL/TLS-HTTP-HTTPS
  • Bootstrap法进行随机模拟
  • 第11章:工程组织与系列总结
  • 8086 处理器寄存器超详细解析:从原理到实战
  • 三分钟打通Stable Diffusion提示词(附实战手册)
  • TDengine 运维——用户和权限
  • Agent 的7 中设计模式
  • 4.Consul服务注册与发现
  • 【深度学习】10. 深度推理(含链式法则详解)RNN, LSTM, GRU,VQA
  • 33.第二阶段x64游戏实战-InLineHook
  • Jmeter——JDBC连接数据库相关
  • 【vscode】切换英文字母大小写快捷键如何配置
  • 《Google I/O 2025:AI浪潮下的科技革新风暴》
  • 宁夏农业科技:创新引领,赋能现代农业新篇章
  • c语言实现Linux命令行补全机制
  • 运用集合知识做斗地主案例
  • 智能指针的使用及原理
  • MCP 登场:掘金开启 AI 前端项目部署新时代
  • 第三章、数据链路层
  • C++智能指针用法及内存管理
  • 双因子COX 交互 共线性 -spss
  • 多态 向上转型
  • YOLO人体姿态估计Pytorch推理ONNX模型推理
  • Android-GestureDetector学习总结
  • 微信小程序(uniapp)对接腾讯云IM
  • Vue 实例生命周期
  • 2025.5.28总结
  • 接口幂等性原理与方案总结
  • Avue表单个别字段实现全选的思路
  • 【Pandas】pandas DataFrame drop