python本地进程通讯----共享内存变量

news2024/9/19 13:36:36

背景

        最近在开发实践中,接触到了需要多进程开发的场景。众所周知,进程和线程最大的区别就在于:进程是资源分配的最小单位,线程是cpu调度的最小单位。对于多进程开发来说,每一个进程都占据一块独立的虚拟内存空间,想要在多进程之间交互难道只能选择管道(PIPE)、套接字(sokect)、远程过程调用(RPC)这种麻烦的东西吗?

        实际上在本地进行多进程开发的时候,只要本进程处于你的系统之下,你可以在自己的父进程中设定共享内存区域,使得子进程可以访问该共享内存变量。

共享内存

在Python中,进程间共享变量最常用的方法之一是通过共享内存。Python的multiprocessing模块提供了对共享内存的支持,主要通过Value、Array、Manager等类来实现。

使用multiprocessing.Value共享单个值

multiprocessing.Value用于在多个进程之间共享一个基本数据类型(如int, float, string等)的值。

import multiprocessing  
import time  
  
def writer(shared_value):  
    for i in range(5):  
        shared_value.value = i  
        print(f"Writer: {shared_value.value}")  
        time.sleep(1)  
  
def reader(shared_value):  
    while True:  
        if shared_value.value != -1:  # 使用-1作为结束信号  
            print(f"Reader: {shared_value.value}")  
            time.sleep(0.5)  
        else:  
            break  
  
if __name__ == "__main__":  
    # 创建一个共享的int值  
    shared_value = multiprocessing.Value('i', 0)  # 'i'表示int类型  
  
    # 创建进程  
    p1 = multiprocessing.Process(target=writer, args=(shared_value,))  
    p2 = multiprocessing.Process(target=reader, args=(shared_value,))  
  
    # 启动进程  
    p1.start()  
    p2.start()  
  
    # 等待writer进程完成  
    p1.join()  
  
    # 发送结束信号给reader  
    shared_value.value = -1  
  
    # 等待reader进程完成  
    p2.join()

需要注意的是multiprocessing.Value的使用方式: 

对于共享整数或者单个字符,初始化比较简单,参照下图映射关系即可。如:

  • i = multiprocessing.Value('i', 1)
  • c = multiprocessing.Value('c', '0')

 注意,如果我们使用的code在上表不存在,则会抛出错误:

TypeError: this type has no size

如果共享的是字符串,则在上表是找不到映射关系的,就是没有code可用。所以我们需要使用原始的ctype类型,如:

from ctypes import c_char_p
ss = multiprocessing.Value(c_char_p, 'ss')

ctype类型可从下表查阅:

使用multiprocessing.Array共享复杂数据结构

当需要共享更复杂的数据结构(如数组或列表)时,可以使用multiprocessing.Array

注意:Array只能存储基本数据类型的数组。和上上图一致

import multiprocessing  
import ctypes  
  
def writer(shared_array):  
    for i in range(5):  
        shared_array[i] = i * i  
        print(f"Writer: {list(shared_array[:i+1])}")  
        time.sleep(1)  
  
def reader(shared_array):  
    while True:  
        if shared_array[0] != -1:  # 假设我们使用第一个元素作为结束信号  
            print(f"Reader: {list(shared_array)}")  
            time.sleep(0.5)  
        else:  
            break  
  
if __name__ == "__main__":  
    import time  
  
    # 创建一个共享的整数数组  
    shared_array = multiprocessing.Array(ctypes.c_int, 5)  # 创建一个长度为5的整数数组  
  
    # 创建进程  
    p1 = multiprocessing.Process(target=writer, args=(shared_array,))  
    p2 = multiprocessing.Process(target=reader, args=(shared_array,))  
  
    # 启动进程  
    p1.start()  
    p2.start()  
  
    # 等待writer进程完成  
    p1.join()  
  
    # 发送结束信号给reader(这里简单地将第一个元素设为-1)  
    shared_array[0] = -1  
  
    # 等待reader进程完成  
    p2.join()  
  

使用multiprocessing.Manager共享更复杂数据结构

Manager提供了一种方法创建数据,数据能够在不同进程之间共享,包括跨网络的运行在不同机器上的进程。manager对象控制有共享对象的服务进程。其他进程通过代理后也能操作共享对象。

import multiprocessing  
  
def worker(d, key, value):  
    d[key] = value  
    print(f'Worker: Setting {key} to {value}')  
  
if __name__ == '__main__':  
    with multiprocessing.Manager() as manager:  
        # 创建一个共享字典  
        d = manager.dict()  
  
        # 创建并启动进程  
        p1 = multiprocessing.Process(target=worker, args=(d, 'foo', 1))  
        p2 = multiprocessing.Process(target=worker, args=(d, 'bar', 2))  
  
        p1.start()  
        p2.start()  
  
        # 等待进程完成  
        p1.join()  
        p2.join()  
  
        # 打印最终的共享字典内容  
        print('Main: Dictionary contents:', d)

参考文献

Python Multiprocessing 多进程并行计算 - Jeremy Feng (fengchao.pro)

python多进程共享变量Value使用tips - 简书 (jianshu.com)

Python多进程并行操作-multiprocessing-Managers - 知乎 (zhihu.com)

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

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

相关文章

大数据新视界 --大数据大厂之探索ES:大数据时代的高效搜索引擎实战攻略

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

致计算机新生们

欢迎你们踏入计算机科学的世界,这是一个充满挑战与机遇的领域。在你们即将开始的大学旅程中,了解计算机专业的就业方向和行业现状是非常重要的。以下是一些关于计算机专业就业方向和行业现状的介绍,希望能够帮助你们更好地规划自己的未来。 …

土豆王国小乐队携手阿派朗创造力乐园,打造2024年okgo儿童音乐节

艺术与科技的完美融合,为首都少年儿童带来音乐盛宴 北京,2024年9月19日 —— 备受期待的2024年okgo儿童音乐节即将于9月21日至22日在北京阿派朗创造力乐园盛大开幕。这场由土豆王国小乐队与阿派朗创造力乐园联合举办的音乐节,旨在为首都及全国…

波分技术基础 -- WDM/OTN介绍

什么是WDM WDM(Wavelength Division Multiplexing):波分复用技术,将不同波长的光信号复用到一根光纤中进行传送的方式(每个波长承载一个业务信号),主要功能是传送和复用。在波分技术出现之前&am…

Gephi 0.9.2中文版百度云下载(附教程)

如大家所了解的,Gephi常用于各种图形和网络的可视化和探索,是最受欢迎的网络可视化软件之一。在生物科学领域,常用于基因共表达网络、蛋白互作网络、微生物相互关系网络等等类似的网络图形绘制。 目前用的比较多的版本为Gephi 0.9.2&#xf…

使用rust自制操作系统内核

一、系统简介 本操作系统是一个使用rust语言实现,基于32位的x86CPU的分时操作系统。 项目地址(求star):GitHub - CaoGaorong/os-in-rust: 使用rust实现一个操作系统内核 详细文档:自制操作系统 语雀 1. 项目特性 …

深度学习自编码器 - 使用自编码器学习流形篇

序言 在数据科学的浩瀚宇宙中,深度学习如同一颗璀璨的星辰,引领着我们对复杂数据内在规律的探索。其中,自编码器作为深度学习家族中的一位独特成员,以其非凡的能力——通过无监督学习捕捉数据的有效表示,而备受瞩目。…

Tomcat_WebApp

Tomcat的目录的介绍 /bin: 这个目录包含启动和关闭 Tomcat 的脚本。 startup.bat / startup.sh:用于启动 Tomcat(.bat 文件是 Windows 系统用的,.sh 文件是 Linux/Unix 系统用的)。shutdown.bat / shutdown.sh&#xf…

Java 实现桌面烟花秀

前言 今天,我们将展示如何使用 Java Swing 创建一个烟花效果,覆盖整个桌面。我们将重点讲解如何在桌面上展示烟花、如何实现发射和爆炸效果,以及如何将这些效果整合到一个完整的程序中。 效果展示 如上图所示,我们在桌面实现了&…

【开源大模型生态9】百度的文心大模型

这张图展示了百度千帆大模型平台的功能架构及其与BML-AI开发平台和百度百舸AI异构计算平台的关系。以下是各个模块的解释: 模型广场: 通用大模型:提供基础的自然语言处理能力。行业大模型:针对不同行业的定制化模型。大模型工具链…

新的 MathWorks 硬件支持包支持从 MATLAB 和 Simulink 模型到高通 Hexagon 神经处理单元架构的自动化代码生成

MathWorks 今天宣布,推出针对 Qualcomm Hexagon™ 神经处理单元(NPU)的硬件支持包。该处理单元嵌入在 Snapdragon 系列处理器中。MathWorks 硬件支持包,则专门针对 Qualcomm Technologies 的 Hexagon NPU 架构进行优化&#xff0c…

基于SSM的“校园外卖管理系统”的设计与实现(源码+数据库+文档+开题报告)

基于SSM的“校园外卖管理系统”的设计与实现(源码数据库文档开题报告) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 消费者系统结构图 商户系统结构图 管理员系统结构图 校…

数据脱敏 (Jackson + Hutool 工具包)

一、简介 系统使用 Jackson 序列化策略,对标注了 Sensitive 注解的属性进行脱敏处理 基于Hutool 脱敏案列: Retention(RetentionPolicy.RUNTIME) Target(ElementType.FIELD) JacksonAnnotationsInside// 表示只对有此注解的字段进行序列化 JsonSeriali…

MySQL高阶1831-每天的最大交易

题目 编写一个解决方案,报告每天交易金额 amount 最大 的交易 ID 。如果一天中有多个这样的交易,返回这些交易的 ID 。 返回结果根据 transaction_id 升序排列。 准备数据 Create table If Not Exists Transactions (transaction_id int, day date, …

吹爆上海交大的大模型实战教程!!—《动手学大模型》附实战教程及ppt

今天分享一个上海交大的免费的大模型课程,有相关教程文档和Slides,目前是2.2K星标,还是挺火的! 《动手学大模型》系列编程实践教程, 由上海交通大学2024年春季《人工智能安全技术》课程(NIS3353&#xff09…

深入剖析Docker容器安全:挑战与应对策略

随着容器技术的广泛应用,Docker已成为现代应用开发和部署的核心工具。它通过轻量级虚拟化技术实现应用的隔离与封装,提高了资源利用率。然而,随着Docker的流行,其安全问题也成为关注焦点。容器化技术虽然提供了良好的资源隔离&…

SHAP 模型可视化 + 参数搜索策略在轴承故障诊断中的应用

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Python轴承故障诊断入门教学-CSDN博客 Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型-CSDN博客 Python轴承故障诊断 (14)高创新故障识别模型-CSDN…

Linux用户组管理

目录 一、增删改用户组 1.1. 创建一个新的用户组 1.2. 创建用户组并指定ID 1.3. 修改用户组的名 1.4. 修改用户组的ID 1.5. 删除一个用户组 二、用户组中的用户操作 2.1. 添加用户到一个已存在的用户组 2.2. 从用户组中移除用户 注:本章内容全部基于Centos…

论文阅读--Planning-oriented Autonomous Driving(二)

自动驾驶框架的各种设计比较。 ( a )大多数工业解决方案针对不同的任务部署不同的模型。 ( b )多任务学习方案共享一个具有分割任务头的主干。 ( c )端到端范式将感知和预测模块统一起来。以往的尝试要么采用( c.1 )中对规划的直接优化,要么采用( c.2 )中的部分元…

基于PHP的高校毕业生就业服务平台

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于phpMySQL的高校毕业生就业…