文章目录

  • 1. 多进程概述
    • 1.1. 多进程的概念
    • 1.2. 多进程注意事项
  • 2. 进程调用方式
    • 2.1. Process 类
      • 2.1.1. 构造方法
      • 2.1.2. 实例方法
      • 2.1.3. 属性
    • 2.2. 面向过程
    • 2.3. 面向对象
  • 3. 进程间通讯
    • 3.1. Queues
    • 3.2. Pipes
    • 3.3. Managers(进行共享数据)
  • 4. 进程同步
  • 5. 进程池

https://blog.csdn.net/qq_39112646/article/details/86772525
https://blog.51cto.com/u_16175431/8116042

1. 多进程概述

1.1. 多进程的概念

Python 提供了非常好用的多进程包 multiprocessing,借助这一个包,可以轻松地从单进程到多进程的转换。只需要定义一个函数,Python 会完成其他所有的事情。
multiprocessing 支持子进程、通信和共享数据、执行不同形式的同步,提供了Process,Queue,Pipe,Lock 组件
multiprocessing 包是 Python 中多进程的管理包,与 threading.Thread() 类似,可以利用 multiprocess.Process() 创建一个进程对象,该对象和 Thread 对象用法形同,也有start()、run()、join()方法。
此外,multiprocess 包中也有Lock、Event、Semaphore、Condition类(这些对象可以向多线程那样,通过参数传递给各个进程),用以同步进程。其用法与 threading 包中的同名类一致。

1.2. 多进程注意事项

  • 在 UNIX 平台上,当某个进程终结之后,该进程需要被其父进程调用 wait,否则进程成为僵尸进程(Zombie)。所以,有必要对每个 Process 对象调用 join() 方法 (实际上等同于 wait)。对于多线程来说,由于只有一个进程,所以不存在此必要性。
  • multiprocessing 提供了 threading 包中没有的 IPC(比如 Pipe 和 Queue),效率上更高。应优先考虑 Pipe 和 Queue,避免使用 Lock、Event、Semaphore、Condition等同步方式 (因为它们占据的不是用户进程的资源)。
  • 多进程应该避免共享资源。在多线程中,我们可以比较容易地共享资源,比如使用全局变量或者传递参数。在多进程情况下,由于每个进程有自己独立的内存空间,以上方法并不合适。此时我们可以通过共享内存和 Manager 的方法来共享资源。但这样做提高了程序的复杂度,并因为同步的需要而降低了程序的效率。
  • window 系统下,需要注意的是要想启动一个子进程,必须加上这句 if name == “main”,进程相关的要写在这句下面。

2. 进程调用方式

2.1. Process 类

2.1.1. 构造方法

Process([group [, target [, name [, args [, kwargs]]]]])

group: 线程组,目前还没有实现,库引用中提示必须是None;
target: 要执行的方法;
name: 进程名;
args/kwargs: 要传入方法的参数。

2.1.2. 实例方法

is_alive(): 返回进程是否在运行。
join([timeout]): 阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的 timeout(可选参数)。
start(): 进程准备就绪,等待 CPU 调度
run(): strat() 调用 run 方法,如果实例进程时未制定传入 target,这 star 执行t默认 run() 方法。
terminate(): 不管任务是否完成,立即停止工作进程

2.1.3. 属性

authkey
daemon: 和线程的 setDeamon 功能一样
exitcode: 进程在运行时为None、如果为–N,表示被信号N结束
name: 进程名字。
pid: 进程号

2.2. 面向过程

from multiprocessing import Process
import timedef func(name):time.sleep(1)print('SubProcess', name)if __name__ == '__main__':processes = [Process(target=func, args=(f"user_{idx}",)) for idx in range(3)]# 开启子进程for p in processes:p.start()# 子进程阻塞执行for p in processes:p.join()print('MasterProcess End')

运行结果:

SubProcess user_2
SubProcess user_0
SubProcess user_1
MasterProcess End

2.3. 面向对象

from multiprocessing import Process
import timeclass MyProcess(Process):def __init__(self, name):# super(MyProcess, self).__init__()super().__init__()self.name = namedef run(self):time.sleep(1)print('SubProcess', self.name)if __name__ == '__main__':processes = [MyProcess(f"user_{idx}") for idx in range(3)]# 开启子进程for p in processes:p.start()# 子进程阻塞执行for p in processes:p.join()print('MasterProcess End')

运行结果同上。

3. 进程间通讯

不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法:

3.1. Queues

from multiprocessing import Process, Queue
import timedef func(name, q):time.sleep(1)print('SubProcess', name)q.put([42, name, 'hello'])if __name__ == '__main__':q = Queue()processes = [Process(target=func, args=(f"user_{idx}", q)) for idx in range(3)]# 开启子进程for p in processes:p.start()# 三个子进程各put 一次print(q.get())print(q.get())print(q.get())# 子进程阻塞执行for p in processes:p.join()print('MasterProcess End')

运行结果:

SubProcess user_0
SubProcess user_1
[42, 'user_0', 'hello']
[42, 'user_1', 'hello']
SubProcess user_2
[42, 'user_2', 'hello']
MasterProcess End

3.2. Pipes

from multiprocessing import Process, Pipedef func(conn):conn.send([42, None, 'hello'])conn.close()if __name__ == '__main__':parent_conn, child_conn = Pipe()p = Process(target=func, args=(child_conn,))p.start()print(parent_conn.recv())   # prints "[42, None, 'hello']"p.join()print('MasterProcess End')

3.3. Managers(进行共享数据)

from multiprocessing import Process, Manager
import timedef func(name, d, l):time.sleep(1)d[name] = {name:name}l.append(name)if __name__ == '__main__':with Manager() as manager:d = manager.dict()l = manager.list()processes = [Process(target=func, args=(f"user_{idx}", d, l)) for idx in range(3)]# 开启子进程for p in processes:p.start()# 子进程阻塞执行for p in processes:p.join()print(d)print(l)print('MasterProcess End')

运行结果:

{'user_0': {'user_0': 'user_0'}, 'user_1': {'user_1': 'user_1'}, 'user_2': {'user_2': 'user_2'}}
['user_0', 'user_1', 'user_2']
MasterProcess End

4. 进程同步

不使用来自不同进程的锁,很容易混淆。

from multiprocessing import Process, Lock
import timedef func(name, lock):lock.acquire()try:time.sleep(1)print('hello world', name)finally:lock.release()if __name__ == '__main__':lock = Lock()processes = [Process(target=func, args=(f"user_{idx}", lock)) for idx in range(3)]# 开启子进程for p in processes:p.start()# 子进程阻塞执行for p in processes:p.join()

运行结果:

hello world user_1
hello world user_0
hello world user_2

5. 进程池

进程池内部维护一个进程序列,当使用时,就去进程池中获取一个进程,如果进程池中没有可供使用的序列,那么程序就会等待,知道进程池中有可用进程为止。
进程池中有两个方法:
apply
apply_async

from multiprocessing import Process, Pool
import timedef Foo(i):time.sleep(2)return i+100def Callback(arg):print('--->exec dong:', arg)if __name__ == '__main__':pool=Pool(5)for i in range(3):#pool.apply(func=Foo,args=(i,))pool.apply_async(func=Foo, args=(i,), callback=Callback)print('MasterProcess Start')pool.close()pool.join()print('MasterProcess End')

运行结果:

MasterProcess Start
--->exec dong: 102
--->exec dong: 100
--->exec dong: 101
MasterProcess End

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

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

相关文章

推荐系统王树森(五)重排多样性提升

重排01:物品相似性的度量、提升多样性的方法_哔哩哔哩_bilibili github-PPT 前面的讨论中提到 在链路的最后进行重排,重排要插入广告和运营笔记,还要做规则打散,提高推荐的丰富性,比如说一个人特别爱看足球&#xff…

Axios多实例封装

Axios多实例封装方案 我将为您提供一个完整的Axios多实例封装方案,包含基础封装、多实例管理和使用示例。 设计思路 创建基础axios实例封装,支持请求/响应拦截器实现多实例管理器,支持不同API端点配置提供统一的错误处理机制支持请求取消功…

为量化从业者提供免费稳定的股票数据源:免费股票数据API获取实时数据、历史数据与技术指标(含多语言代码指南)实例代码演示与API文档说明

​ 近年来,股票量化分析因其科学、系统的研究方法,日益成为市场热点。而进入这一领域的首要步骤,正是获取全面、准确的股票数据——无论是实时交易行情、历史走势记录,还是企业财务与基本面信息,都是支撑量化策略的核心…

[Sync_ai_vid] UNet模型 | 音频特征提取器(Whisper)

第2章:LatentSync UNet模型 在第1章:唇形同步推理流程中,我们了解到唇形同步推理流程如同电影导演,协调各"专家模块"生成完美唇形同步视频。 本章将深入解析这个"工作室"中最核心的专家——LatentSync UNet…

工业级TF卡NAND + 北京君正 + Rk瑞芯微的应用

目录前言一:操作CS创世 SD NAND的常用命令1.查看SD设备2.挂载分区3.卸载分区4.分区管理5.格式化分区6.简单读写二:SD底层协议简要介绍三:对CS创世 SD NAND进行读写操作的三大方式1. 使用dd命令2. 使用块设备的标准接口3. 使用ioctl产生系统调…

深入解析Java并发编程与单例模式

目录 一、调度(四) 1.随机调度大环境 二、锁(二) 1.位置 2.无锁阻塞 3.重入锁 4.连续锁 4.1措施 三、线程方法(二) 1.wait 2.notify 3.wait-notify指位后移 3.1可能时再检查 3.1.1join(二) 3.1.1.1可能时再检查死亡 四、单例模式 1.实现 1.1private构造器 1…

java通过redis简单实现分布式锁

目录 一、简介 二、代码实现 1、maven添加依赖 2、核心逻辑代码 3、使用方式 三、总结 一、简介 我们知道在Java中可以通过关键字synchronized来防止并发引起的问题,而分布式中就需要考虑分布式锁了,今天来讲一个比较简单的实现,通过re…

网络编程--TCP/UDP Socket套接字

网络编程 程序员主要操作应用层和传输层来实现网络编程,也就是自己写一个程序,让这个程序可以使用网络来通信,这个程序属于应用层,实现通讯就需要获取到传输层提供的服务 这就需要使用传输层提供的api UDP: 无连接,不可…

claude-code订阅方案

Claude Code 订阅方案对比 编写日期:2025 年 08 月 20 日 🏷️ 专业版 Pro ($20/月,$200/年) 主要特性 可用模型:Claude Sonnet 4(Claude Opus 4成本太高,谨慎选择)适用场景:适合轻度…

146. LRU缓存

题目: 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值&#x…

第二十节:3D文本渲染 - 字体几何体生成与特效

第二十节:3D文本渲染 - 字体几何体生成与特效 TextGeometry深度解析与高级文字效果实现1. 核心概念解析 1.1 3D文字渲染技术对比技术原理优点缺点TextGeometry将字体轮廓转换为3D网格真实3D效果,支持材质性能开销大,内存占用高Canvas纹理将文…

zzz‘sJava知识点概括总结

类型转化 字符串&#xff1a;c语言&#xff1a;char Java&#xff1a;string 表达式值的类型由最高类型决定&#xff1a; 取值范围&#xff1a;byte<short<int<long<float<double&#xff08;且运算时byte和short都是转化为int类型进行计算防止数据溢出&…

SONiC 之 Testbed(2)Ansible

Ansible 是一款由 Red Hat 主导开发的 开源自动化工具&#xff0c;专注于 配置管理、应用部署、任务编排和IT自动化。它基于 无代理&#xff08;Agentless&#xff09;架构&#xff0c;通过 SSH&#xff08;默认&#xff09;或 WinRM 协议与目标设备通信&#xff0c;无需在被控…

瑞芯微RK3568与君正X2600e平台Linux系统CS创世SD NAND应用全解析与驱动架构详解

前言 今天就瑞芯微平台和北京君正平台下的linux系统中关于CS创世 SD NAND的使用做一些经验的分享&#xff0c;如有不正&#xff0c;请批评指正&#xff1b; 采用的开发板是RK3568和x2600e&#xff0c;ubuntu版本是20.04&#xff0c;交叉编译工具链是aarch64-linux-gnu-和mips…

深入解析 Flink Function

RichFunctionFunction只是个标记接口public interface Function extends java.io.Serializable {}RichFunction 的核心语义是为用户定义的函数&#xff08;UDF&#xff09;提供生命周期管理和运行时上下文访问的能力。任何一个普通的 Flink Function 接口&#xff08;例如 MapF…

JMeter —— 压力测试

目录 常用的性能指标 一、吞吐量类指标 二、响应时间类指标 三、资源利用率指标 JMeter 一、JMeter 简介 二.下载安装JMeter&#xff1a; 三.如何使用JMeter&#xff1a; 压力测试考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在。压测都是为了系统…

Transformer在哪⾥做了权重共享?

1、什么是权值共享权重共享是指在模型的不同层之间复⽤相同的参数。这可以减少模型的总体参数数量&#xff0c;并使得模型在训练时更容易学习。2、在Transformer中的应用常见的做法是共享词嵌入层&#xff08;embedding layer&#xff09;和输出层&#xff08;output layer&…

将 agents 连接到 Elasticsearch 使用模型上下文协议 - docker

我们在之前的文章 “将 agents 连接到 Elasticsearch 使用模型上下文协议” 及 “使用 MCP 将代理连接到 Elasticsearch 并对索引进行查询” 详述了如何使用 Elasticsearch MCP server 来和我们的 Elasticsearch 进行对话。细心的开发者可能已经注意到我们的 Elasticsearch MCP…

Shell 编程基础与实践要点梳理

目录 前言 一、认识 Shell 1.1 Shell 的定义与作用 1.2 Shell 解释器 二、Shell 脚本入门 2.1 编写 Shell 脚本 2.2 赋予执行权限与执行脚本 三、Shell 变量 3.1 变量定义与规则 3.2 变量使用与操作 3.3 变量类型 四、Shell 字符串 4.1 字符串定义方式 4.2 字符串…

Python自动化测试完整教程:pytest + selenium实战

目录 前言环境搭建pytest基础教程selenium基础教程pytest selenium实战项目页面对象模式(POM)测试报告生成持续集成配置最佳实践和进阶技巧总结 前言 自动化测试是现代软件开发中不可或缺的一环。Python作为一门简洁优雅的编程语言&#xff0c;配合pytest测试框架和seleniu…