python多进程的使用

多进程编程全面指南:从入门到实践

摘要:本文是为初学者设计的Python多进程编程全攻略,涵盖基础概念、核心函数详解、系统特性分析,并附带流程图、测试用例、开源项目推荐和经典书籍清单。通过8个实战代码示例和3个性能对比实验,帮你避开常见陷阱,快速掌握进程级并行计算。


一、多进程基础概念图解

1.1 进程 vs 线程

程序
进程
线程
独立内存空间
系统调度
共享进程内存
轻量级
特性进程线程
隔离性完全独立共享内存
创建开销大(需复制资源)
通信方式管道/队列/共享内存直接内存访问
崩溃影响不影响其他进程导致进程终止

1.2 何时选择多进程?

  • CPU密集型任务(如图像处理)
  • 需要突破GIL限制
  • 要求更高稳定性(进程崩溃互不影响)

二、Python多进程核心API详解

2.1 Process类参数解剖

from multiprocessing import Processdef worker(name, count):print(f"{name} processed {count} items")if __name__ == '__main__':p = Process(target=worker,      # 必选:目标函数name="Worker1",     # 进程名称(调试用)args=("A", 100),    # 位置参数元组kwargs={'count':50},# 关键字参数字典daemon=True         # 是否设为守护进程)p.start()

关键参数说明

  • daemon:父进程退出时自动终止子进程
  • name:通过ps -ef可查看的进程标识
  • args:注意单元素元组要加逗号(x,)

2.2 跨进程通信三剑客

1. Queue队列(线程安全)
from multiprocessing import Queue
q = Queue(maxsize=10)  # 缓冲区大小
q.put(obj, block=False) # 非阻塞模式
2. Pipe管道(双向通信)
parent_conn, child_conn = Pipe(duplex=True)
child_conn.send(obj)  # 发送可序列化对象
3. SharedMemory(Python3.8+)
from multiprocessing import shared_memory
shm = shared_memory.SharedMemory(name='shm1', create=True, size=1024)

三、五大实战场景与性能测试

3.1 基础创建测试(benchmark.py)

import time
from multiprocessing import Processdef cpu_bound(n):return sum(i*i for i in range(n))if __name__ == '__main__':sizes = [10**6, 5*10**6]for n in sizes:# 单进程版start = time.time()[cpu_bound(n) for _ in range(4)]print(f"Sequential: {time.time()-start:.2f}s")# 多进程版start = time.time()procs = [Process(target=cpu_bound, args=(n,)) for _ in range(4)][p.start() for p in procs][p.join() for p in procs]print(f"Parallel: {time.time()-start:.2f}s")

测试结果(4核CPU)

数据规模串行执行4进程并行加速比
1,000,0001.82s0.63s2.89x
5,000,0009.15s2.91s3.14x

四、系统级特性与注意事项

4.1 Unix vs Windows差异

特性Unix系Windows
进程创建fork()快速复制重新导入解释器
全局变量子进程继承不继承
序列化要求较宽松必须可pickle

4.2 常见陷阱解决方案

  1. 僵尸进程预防

    import signal
    signal.signal(signal.SIGCHLD, signal.SIG_IGN)
    
  2. 日志冲突处理

    from multiprocessing import get_logger
    logger = get_logger()
    logger.addHandler(logging.FileHandler('mp.log'))
    
  3. 平台兼容写法

    if __name__ == '__main__':  # Windows必须加freeze_support()       # PyInstaller打包需要
    

五、生态资源推荐

5.1 经典开源项目

  1. Celery:分布式任务队列(支持进程级并发)

    pip install celery
    
  2. Dask:并行计算库(智能任务调度)

    from dask import delayed
    results = [delayed(process)(x) for x in data]
    
  3. Ray:高性能分布式执行框架

    @ray.remote
    def parallel_task(x):return x**2
    

5.2 推荐书单

  • 《Python并行编程手册》- 王永祥
  • 《High Performance Python》2nd Edition - Micha Gorelick
  • 《Multiprocessing with Python》- Dusty Phillips

六、完整示例:图片处理流水线

# image_pipeline.py
from PIL import Image
from multiprocessing import Pooldef process_image(path):img = Image.open(path)return img.filter(ImageFilter.GaussianBlur(2))if __name__ == '__main__':with Pool(processes=4) as pool:results = pool.map(process_image, glob.glob('*.jpg'))

优化技巧

  • 使用imap_unordered获取即时结果
  • 设置chunksize减少IPC开销
  • 配合ThreadPool处理IO密集型阶段

结语:多进程编程像乐高积木——正确组合基础模块能构建高性能系统。记住:1)隔离性是优势也是成本 2)IPC开销决定扩展性 3)根据任务类型选择并发模型。现在尝试用concurrent.futures.ProcessPoolExecutor重构一个你的旧脚本吧!

下一步学习

  • 进程池的负载均衡策略
  • 与asyncio的混合使用
  • 使用multiprocessing.Manager实现高级共享状态

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

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

相关文章

数据库管理与安全:从用户权限到备份恢复的全面指南

引言 在数字化时代,数据已成为组织最宝贵的资产之一。数据库作为存储和管理这些数据的核心系统,其安全性和可靠性直接关系到企业的运营和发展。无论是金融交易记录、医疗健康信息,还是电子商务平台的用户数据,都需要通过完善的数…

Electron Forge【实战】带图片的 AI 聊天

改用支持图片的 AI 模型 qwen-turbo 仅支持文字,要想体验图片聊天,需改用 qwen-vl-plus src/initData.ts {id: 2,name: "aliyun",title: "阿里 -- 通义千问",desc: "阿里百炼 -- 通义千问",// https://help.aliyun.com/z…

在 Elastic 中使用 JOIN 进行威胁狩猎!

作者:来自 Elastic Paul Ewing, Jonhnathan Ribeiro Elastic 的管道查询语言 ES | QL 为查询带来了 join 功能。 威胁狩猎者欢呼吧!你是否一直在寻找一种通过 Elastic 的速度和强大功能来连接数据的方法?好消息!Elastic 现在可以通…

从实列中学习linux shell5: 利用shell 脚本 检测硬盘空间容量,当使用量达到80%的时候 发送邮件

下面是用于检测硬盘空间并在使用量达到80%时发送邮件的Shell脚本 第一步 编写脚本 #!/bin/bash# 邮件配置 recipient"zhaoqingyou99qhzt.com" subject"磁盘空间警报" mail_cmd"/usr/bin/mail" # 根据实际邮件命令路径修改# 检查是否安装邮件工…

Ethan独立开发产品日报 | 2025-04-30

1. Daytona 安全且灵活的基础设施,用于运行你的人工智能生成代码。 Daytona Cloud重新定义了AI代理的基础设施,具备低于90毫秒的启动时间、原生性能和有状态执行能力,这些是传统云服务无法比拟的。您可以以前所未有的速度和灵活性来创建、管…

Unity SpriteMask(精灵遮罩)

🏆 个人愚见,没事写写笔记 🏆《博客内容》:Unity3D开发内容 🏆🎉欢迎 👍点赞✍评论⭐收藏 🔎SpriteMask:精灵遮罩 💡作用就是对精灵图片产生遮罩&#xff0c…

OpenHarmony全局资源调度管控子系统之内存管理部件

OpenHarmony之内存管理部件 内存管理部件 简介目录框架 进程回收优先级列表 补充 回收策略/查杀策略 使用说明参数配置说明 availbufferSizeZswapdParamkillConfignandlife 相关仓 简介 内存管理部件位于全局资源调度管控子系统中,基于应用的生命周期状态&#…

姜老师的MBTI课程笔记小结(1)ENFJ人格

课程文稿: 好,今天我们的重点其实并不在ENTJ,而是在于如果一个人其他都很像,只是在思考和感受这两端选择的时候,他缺了思考而更尊重感受,它会是什么样的一个人格特质呢?这就是ENFG在16人格的学派…

Node.js 应用场景

Node.js 应用场景 引言 Node.js 是一个基于 Chrome V8 JavaScript 引擎的开源、跨平台 JavaScript 运行环境。它主要用于服务器端开发,通过非阻塞 I/O 模型实现了高并发处理能力。本文将详细介绍 Node.js 的应用场景,帮助你了解其在实际项目中的应用。…

Qt/C++面试【速通笔记六】—Qt 中的线程同步

在多线程编程中,多个线程同时访问共享资源时,可能会出现数据不一致或者错误的情况。这时,我们需要线程同步机制来保证程序的正确性。Qt 提供了多种线程同步方式,每种方式适用于不同的场景。 1. 互斥锁(QMutex&#xff…

JDK-17 保姆级安装教程(附安装包)

文章目录 一、下载二、安装三、验证是否安装成功1、看 java 和 javac 是否可用2、看 java 和 javac 的版本号是否无问题 一、下载 JDK-17_windows-x64_bin.exe 二、安装 三、验证是否安装成功 java:执行工具 javac:编译工具 1、看 java 和 javac 是否…

【LeetCode Hot100】回溯篇

前言 本文用于整理LeetCode Hot100中题目解答,因题目比较简单且更多是为了面试快速写出正确思路,只做简单题意解读和一句话题解方便记忆。但代码会全部给出,方便大家整理代码思路。 46. 全排列 一句话题意 给定一个无重复数字的序列&#xf…

pytest-前后置及fixture运用

1.pytest中的xunit风格前后置处理 pytest中用例的前后置可以直接使用类似于unittest中的前后置处理,但是pytest中的前后置处理方式更 加丰富,分为模块级、类级、方法级、函数级等不同等级的前后置处理,具体见下面的代码: test_…

使用scipy求解优化问题

一、求解二次规划问题 min(X.T * P * X C.T * X) s.t. Xi > 0 ∑Xi 1 1.定义目标函数 def objective(x):return 0.5 * np.dot(x, np.dot(P, x)) np.dot(c, x)2. 定义等式约束 def equality_constraint(x):return np.sum(x) - 1 3.定义边界约束:x # …

C++初阶-STL简介

目录 1.什么是STL 2.STL的版本 3.STL的六大组件 4.STL的重要性 4.1在笔试中 4.2在面试中 4.3.在公司中 5.如何学习STL 6.总结和之后的规划 1.什么是STL STL(standard template library-标准模板库);是C标准库的重要组成部分&#xf…

kivy android打包buildozer.spec GUI配置

这个适合刚刚学习kivyd的道友使用,后面看情况更新 代码 import tkinter as tk from tkinter import ttk, filedialog, messagebox, simpledialog import configparser import os import json # 新增导入class BuildozerConfigTool:def __init__(self, master):se…

MOOS-ivp使用(一)——水下机器人系统的入门与使用

MOOS-ivp使用(一)——水下机器人系统的入门与使用 MOOS-ivp(Marine Operational Oceanographic System for Intelligent Vehicle Planning)是专为水下机器人(如AUV)设计的开源框架。类似于ROS,…

电子病历高质量语料库构建方法与架构项目(智能质控体系建设篇)

引言 随着人工智能技术的迅猛发展,医疗信息化建设正经历着前所未有的变革。电子病历作为医疗机构的核心数据资产,其质量直接关系到临床决策的准确性和医疗安全。传统的病历质控工作主要依赖人工审核,存在效率低下、主观性强、覆盖面有限等问题。近年来,基于人工智能技术的…

react学习笔记4——React UI组件库与redux

流行的开源React UI组件库 material-ui(国外) 官网: http://www.material-ui.com/#/github: GitHub - mui/material-ui: Material UI: Comprehensive React component library that implements Googles Material Design. Free forever. ant-design(国内蚂蚁金服) 官网: Ant…