python多进程 —— multiprocessing.Manager —— 跨主机共享内存的读写

news/2025/11/16 19:23:48/文章来源:https://www.cnblogs.com/xyz/p/19228762

python多进程 —— multiprocessing.Manager —— 跨主机共享内存的读写

python多进程 —— multiprocessing.Manager —— 跨主机共享内存的读写



示例代码:

点击查看代码
import multiprocessingdef f(ns):ns.x.append(1)ns.y.append("a")if __name__ == '__main__':manger = multiprocessing.Manager()ns = manger.Namespace()ns.x = []ns.y = []p = multiprocessing.Process(target=f, args=(ns,))p.start()p.join()print(ns.x)print(ns.y)

该代码运行的结果并不是 [1] 和 ['a'],而是:

image


由此可见对跨主机的共享内存的修改并不能简单的直接操作,根据资料显示可知,manger下的共享内存仅仅能传播如manager.list()这样的可变对象,如果我们不使用该种写法,就必须在子进展中手动的实现对manger空间下的变量的赋值操作。


修改后的代码:

点击查看代码
import multiprocessing"""
def f(ns):ns.x.append(1)ns.y.append("a")if __name__ == '__main__':manger = multiprocessing.Manager()ns = manger.Namespace()ns.x = []ns.y = []p = multiprocessing.Process(target=f, args=(ns,))p.start()p.join()print(ns.x)print(ns.y)
"""def f(ns, x, y):x.append(1)y.append("a")# ns.x = [11, 22, 33, [44, 55]]# ns.x = 0ns.x = xns.y = yns.z = 111if __name__ == '__main__':manger = multiprocessing.Manager()ns = manger.Namespace()ns.x = []ns.y = []p = multiprocessing.Process(target=f, args=(ns, ns.x, ns.y))p.start()p.join()print(ns.x)print(ns.y)print(ns.z)

运行结果:

image


由此可见,在子进程中传入的manager实例及其命令空间下的变量其实在传参时是一种copy操作,而不是引用操作,因此在子进程中的任何操作并不会改变共享内存下的变量的,因此我们需要在子进程中手动的来对共享内存命令空间下的变量进行手动赋值。


为此我们可以进行一种更极端的编程代码:

点击查看代码
import multiprocessing"""
def f(ns):ns.x.append(1)ns.y.append("a")if __name__ == '__main__':manger = multiprocessing.Manager()ns = manger.Namespace()ns.x = []ns.y = []p = multiprocessing.Process(target=f, args=(ns,))p.start()p.join()print(ns.x)print(ns.y)
""""""
def f(ns, x, y):x.append(1)y.append("a")# ns.x = [11, 22, 33, [44, 55]]# ns.x = 0ns.x = xns.y = yns.z = 111if __name__ == '__main__':manger = multiprocessing.Manager()ns = manger.Namespace()ns.x = []ns.y = []p = multiprocessing.Process(target=f, args=(ns, ns.x, ns.y))p.start()p.join()print(ns.x)print(ns.y)print(ns.z)
"""import time
def f(ns, x, y):for i in range(10):x.append(i)y.append(str(i))ns.x = xns.y = ytime.sleep(1)if __name__ == '__main__':manger = multiprocessing.Manager()ns = manger.Namespace()ns.x = []ns.y = []p = multiprocessing.Process(target=f, args=(ns, ns.x, ns.y))p.start()for i in range(10):print(ns.x)print(ns.y)time.sleep(1)p.join()print(ns.x)print(ns.y)

运行效果:

image


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

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

相关文章

AT_agc063_e Child to Parent 题解

AT_agc063_e Child to Parent 题解 设 \(c_x\) 表示点 \(x\) 一共执行的操作次数,对于不同的 \(c_x\) 序列最终的 \(A\) 序列是不同的,因此我们对 \(c_x\) 序列计数即可。 容易发现一个 \(c_x\) 合法的充要是 \(0\le…

详细介绍:UVa 11129 An Antiarithmetic Permutation

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

3天掌握OpenHarmony+Python开发:高效适配教程与真实项目案例精讲 - 教程

3天掌握OpenHarmony+Python开发:高效适配教程与真实项目案例精讲 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

飞牛os打开本机usb摄像头

飞牛os打开本机usb摄像头笔记本安装了飞牛os,想打开本机的USB摄像头,参考文章——Linux运维笔记[15]-网页ip摄像头 我用的是第一种办法,有些命令需要修改: 1、安装go并配置环境wget -O go_install.sh https://go.g…

CF 2156E Best Time to Buy and Sell Stock

vp 这场 E, F1 都写爆了被一起逮捕,我是人?直接求解答案似乎并不容易,因为需要考虑的大小关系太多了,于是可以尝试二分转为 01 问题。 于是尝试思考,如何判断答案是否 \(\ge w\)。 这个问题并不具有一些特殊的结构…

《重生之我成为世界顶级黑客》第七章:成功了,但没完全成功

《重生之我成为世界顶级黑客》第七章:成功了,但没完全成功继续肝,还剩一丢丢灵感。第二天清晨,龙傲天是被急促的手机铃声吵醒的。他迷迷糊糊地摸过手机,看到屏幕上显示着一个陌生的号码。出于习惯,他先是检查了一…

12306售票系统分析与实战

1. 内容介绍 MVP:Minimum Viable Product 最简化实行产品 核心功能:实体管理 生成座位 放票 查询余额 抢票 生成订单 ...核心内容:需求设计 数据库设计 项目搭建 流行的设计思想 后台管理实现 前台查余票及购买 组件…

Java StringTokenizer 类 Scanner 类详解

Java StringTokenizer 类介绍 概述 StringTokenizer 是一个遗留类,用于将字符串分割成标记(tokens)。 但在现代 Java 开发中已被更强大的 String.split() 和 Scanner 类取代,新项目应使用更现代的解决方案。 基本用…

实用指南:Open Inventor 2025.2 FOR JAVA

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

25.11.15随笔联考总结(补)

考试 开考通读题面,感觉第一题很简单,看 T2,感觉是一个比较好做的计数,T3 给人一种点分治的感觉,T4 挺神秘的不清楚。开考半个小时后决定回去验证 T1 正确性,发现假了,重新思考,想了可能有 20 多分钟大概会了,…

Java 断言(Assert) 简介

什么是断言? 断言是一种调试工具,用于在代码中检查必须为真的条件。如果条件为假,JVM 会抛出 AssertionError。 核心特点:调试工具:主要用于开发测试阶段默认禁用:需要手动启用快速失败:条件不满足时立即终止不…

2025年中小学生 AI 学习机选购指南:松鼠 AI 双线模式成优选

2025年中小学生 AI 学习机选购指南:松鼠 AI 双线模式成优选一、首选松鼠AI学习机:双线融合的“精准提分专家” 作为2025年AI教育领域的黑马品牌,松鼠AI以“AI学习机+全国1200+自习室”的创新模式,打破传统学习机“…

《重生之我成为世界顶级黑客》第六章:一线生机

《重生之我成为世界顶级黑客》第六章:一线生机已经尽可能把敏感的去掉了,不知道帖子能存在多久。唉,不让聊的。清晨六点半,龙傲天准时被闹钟唤醒。胃部的隐痛已经成了每日的例行公事,他机械地吞下一片胃药,用冷水…

20232305 2025-2026-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 1.1掌握基本的信息搜集方法 1.2学习并掌握端口扫描及漏洞扫描技术 1.3利用所学知识对自己隐私加以保护 2.实验过程 2.1从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取信息 2.…

遥感建筑物变化检测内容集

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:IntelliJ IDEA 2023中为 Spring Boot 项目添加注释模板

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【UE源码向】GameplayTag增加ToolTip

GamepayTag 的 ToolTip 增加 DevComment我想绝大部分的 UE 项目都会大量使用到 GameplayTag 的功能,主要是用来做一些功能分类、状态标记和资产引用。 问题:在引擎的早期版本中(< 5.6),GameplayTag 的鼠标悬浮…

基于c++ eigen的Nelder-Mead算法(仿照scipy)

简介 本文展示了用C++(Eigen)实现的Nelder-Mead算法,该实现仿照了Python SciPy库中的scipy.optimize.fmin函数。虽然目前仅完成了基础功能(fmin不支持full_output和retall),但已经可以应用于实际优化问题。 Nelder…