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

背景

        最近在开发实践中,接触到了需要多进程开发的场景。众所周知,进程和线程最大的区别就在于:进程是资源分配的最小单位,线程是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.xdnf.cn/news/143937.html

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

相关文章

Mobile net V系列详解 理论+实战(2)

Mobilenet 系列 实践部分一、数据集介绍二、模型整体框架三、模型代码详解四、总结 实践部分 本章针对实践通过使用pytorch一个实例对这部分内容进行吸收分析。本章节采用的源代码在这里感兴趣的读者可以自行下载操作。 一、数据集介绍 可以看到数据集本身被存放在了三个文件…

django学习入门系列之第十点《A 案例: 员工管理系统10》

文章目录 12 管理员操作12.4 密码加密12.5 获取对象(防止id错误--编辑界面等)12.6 编辑管理员12.7 重置密码 往期回顾 12 管理员操作 12.4 密码加密 密码不应该以明文的方式直接存储到数据库,应该加密才放进去 定义一个md5的方法&#xff…

4 html5 web components原生组件详细教程

web components 前面我们已经介绍过,这一期我们就来讲一讲具体用法和这其中的关键只是点: 1 基本使用 如果我们想实现一个封装的原生组件,那就离不开使用js去封装,这里主要就是基于HTMLElement这个类,去创建创建一个…

OpenCV运动分析和目标跟踪(2)累积操作函数accumulateSquare()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将源图像的平方加到累积器图像中。 该函数将输入图像 src 或其选定区域提升到2的幂次方,然后加到累积器 dst 中: dst ( …

Android WebView H5 Hybrid 混和开发

对于故乡,我忽然有了新的理解:人的故乡,并不止于一块特定的土地,而是一种辽阔无比的心情,不受空间和时间的限制;这心情一经唤起,就是你已经回到了故乡。——《记忆与印象》 前言 移动互联网发展…

用Python画一个五星红旗

#codingutf-8 import turtle import mathdef draw_polygon(aTurtle, size50, n3): 绘制正多边形args:aTurtle: turtle对象实例size: int类型,正多边形的边长n: int类型,是几边形 for i in range(n):aTurtle.forward(size)aTurtle.left(360.0/n)de…

esp32-C2 对接火山引擎实现语音转文本(二)

目录 一、 语音转文本初始化 二、 WedStream 事件处理函数 一、 语音转文本初始化 Volcengine_vtt_handle_t Volcengine_Vtt_Init(Volcengine_vtt_config_t *config) {// 管道配置audio_pipeline_cfg_t pipeline_cfg = DEFAULT_AUDIO_PIPELINE_CONFIG();Volcengine_vtt_t *vt…

【从计算机的发展角度理解编程语言】C、CPP、Java、Python,是偶然还是应时代的产物?

参考目录 前言什么是"computer"?计算机的大致发展历程计算机系统结构阶段(1946~1981)计算机网络和视窗阶段(1982~2007)复杂信息系统阶段(2008~today)人工智能阶段 越新的语言是越好的吗、越值得学习吗? 前言 最近读了 《Python语言程序设计基础》 这本书…

数据结构与算法学习day21-回溯法

一、组合 1.题目 . - 力扣(LeetCode) 2思路 把组合问题抽象成树形结构(N叉树) 每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围。 图中可以发现n相当于树的宽度&#xff0c…

[Linux]进程控制详解

1.创建进程 进程调用fork,当控制转移到内核中的fork代码后,内核做: ● 分配新的内存块和内核数据结构给子进程 ● 将父进程部分数据结构内容拷贝至子进程 ● 添加子进程到系统进程列表当中 ● fork返回,开始调度器调度 这个前面提到过&#…

c++基础入门三

文章目录 C基础入门(三)auto关键字auto简介使用细则一、可以和指针联合使用二、在一行定义多个变量 不能使用场景一、不能作为函数的参数二、不能用来声明数组 基于for的循环使用条件 指针空值nullptr C基础入门(三) 回顾上集,我们介绍了C的函数重载,引…

JAVA并发编程系列之Semaphore信号量剖析

腾讯T2面试,现场限时3分钟限最多20行代码,模拟地铁口安检进站。其中安检入口10个,当前排队人数是100个,每个人安检进站耗时5秒。开始吧! 候选人,心中万马奔腾!!!吐了一口82年老血&am…

电池管理仓的拆解

拆解视频里面可以学习到大厂的设计思想和创意,接触到比较行业化的设计方案,从而提升设计电路的水平。 电池仓: 电池管家的芯片用的就是前段时间了解到的STM32G030C8T6,便宜好用的典范: 弧形走线较为推荐: …

C++初阶学习——探索STL奥秘——标准库中的queue与stack

1、适配器模式 STL 中的适配器可以分为三类: 从应用角度出发 容器适配器 container adapters 迭代器适配器 iterator adapters 仿函数适配器 functor adapters 其中,容器适配器可修改底层为指定容器 如由 vector 构成的栈、由 list 构成的队列 迭代器适配器…

sqli-labs靶场搭建

下载了一个phpstudy进行搭靶场搭建 然后打开phpstudy安装好php,mysql等环境 正式sqli-labs靶场搭建 第一步:下载源码:https://codeload.github.com/Audi-1/sqli-labs/zip/master 解压后放进网站根目录,进到 sqli-labs的文件夹下&#xff0…

windows C++ 并行编程-异步代理库概述

异步代理库(简称代理库)提供了一个编程模型,该模型可提高支持并发的应用程序开发的可靠性。 代理库是一个 C 模板库,为粗粒度数据流和管道任务提升了基于角色的编程模型和进程内消息传递。 代理库构建在并发运行时的计划和资源管理…

Windows系统通过部署wsl + Goland进行跨平台开发

1.背景 近期项目中因为用到了 Golang库中的 "log/syslog" 包,而这个包是禁止在windows平台上编译的. 并且在windows环境上开发也会有诸多不便,如执行makefile文件的make命令,本地开发环境中docker,etcd,redis的搭建等等,而这些通过部署wsl去搭建一个linux环境就很可以…

如何使用下拉字段创建WordPress表单(简单方法)

许多网站所有者在收集用户输入时,都会因为表单过长而让用户感到压迫。 下拉列表字段通过提供一个简洁的选项列表,使表单变得更简单。这意味着它们可以提高表单完成率,并改善用户体验。 在本文中,我们将向您展示如何创建带有下拉…

Kubernetes从零到精通(11-CNI网络插件)

Kubernetes网络模型 Kubernetes的网络模型(Kubernetes Networking Model)旨在提供跨所有节点、Pod和服务的统一网络连接。它的核心理念是通过统一的网络通信规则,保证集群中的所有组件能够顺畅地相互通信。Kubernetes网络模型主要有以下几个关…

专业学习|随机规划概观(性质、针对问题与分类)

一、随机规划概观 随机规划(Stochastic Programming)是一种用于处理决策问题中的不确定性的优化方法。它能够在决策过程中考虑到未来的不确定性,从而帮助找到在不同情境下都能较好表现的解决方案。以下是随机规划能解决的一些主要问题以及它的…