[b0035] python 归纳 (二十)_多进程数据共享和同步_共享内存Value & Array
1. Code
# -*- coding: utf-8 -*-
"""
多进程 数据共享 共享变量 Value,Array
逻辑:
2个进程,对同一份数据,一个做加法,一个做加法,各做10次 总结:
1、入口代码 必须放在 if __name__ == '__main__' 下,不然报错,不清楚为什么
用法:
1. 创建共享变量 o = Value('i',1000) or o = Array('i',list) 指定不同的类型
2. 启动子进程通过 o.value or o[i] 存取变量的值
3. 必要使用锁操作函数 o.acquire() o.release() 参考:
get_lock() 返回共享变量使用的Rlock 实例
get_obj() 返回共享变量数据类型 """
from multiprocessing import Process,Value,Array
import time
import random # 对共享变量加法
def save_money(money):
money.acquire() # 申请锁
for i in range(10):
time.sleep(0.3)
change = random.randint(1,200)
money.value += change
print "\n ",money.value,change
money.release() # 释放锁 # 对共享变量减法
def take_money(money):
money.acquire()
for i in range(10):
time.sleep(0.5)
change = random.randint(1,150)
money.value -= change
print "\n ",money.value," ",-change
money.release() # 修改共享变量数组
def save_money2():
m.acquire() # 申请锁
m[2] = 8
print [ i for i in m ]
m.release() # 释放锁 # 读取共享变量数组
def take_money2():
m.acquire() # 申请锁
print [ i for i in m ]
m.release() # 释放锁 if True:
m = Array('i',[1,2,3,4,5]) # 放在main下面,就不是全局了 if __name__ == '__main__':
# 共享内存,可以多个进程存取,整型,变量名money,变量值1000
money = Value('i',1000) d = Process(target=save_money, args=(money,))
d.start()
w = Process(target=take_money, args=(money,))
w.start() d.join()
w.join() Process(target=save_money2).start()
Process(target=take_money2).start() print "end"
Out:
995 -5 892 -103 814 -78 694 -120 668 -26 550 -118 482 -68 423 -59 293 -130 188 -105 193 5 325 132 473 148 535 62 539 4 677 138 738 61 875 137 1066 191 1231 165
end
[1, 2, 8, 4, 5]
[1, 2, 3, 4, 5]
2 资料
https://www.cnblogs.com/gengyi/p/8661235.html
基本特点:
(1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。
(2)为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率。(文件映射)
(3)由于多个进程共享一段内存,因此也需要依靠某种同步机制。
优缺点:
优点:快速在进程间传递数据
缺点: 数据安全上存在风险,内存中的内容会被其他进程覆盖或 者篡改
注: 经常和同步互斥配合使用
Value:将一个值存放在内存中,
Array:将多个数据存放在内存中,但要求数据类型一致
Value


注: Value('h',1) = Value(c_short,1)
Array
Array(typecode_or_type, size_or_initializer, *, lock=True)
使用基本类似于Value,Returns a synchronized shared array
typecode_or_type:定义转换成C语言的存储类型;
size_or_initializer:如果它是一个整数,那么它确定数组的长度,并且数组将被初始化为零。否则,size_or_initializer是用于初始化数组的序列,其长度决定数组的长度
lock : lock为True,则会创建一个新的锁对象,以同步对该值的访问。如果lock是Lock或RLock对象,那么它将用于同步对该值的访问。如果lock是False,那么对返回的对象的访问不会被锁自动保护,因此它不一定是“进程安全的”
[b0035] python 归纳 (二十)_多进程数据共享和同步_共享内存Value & Array的更多相关文章
- [b0037] python 归纳 (二二)_多进程数据共享和同步_管道Pipe
# -*- coding: utf-8 -*- """ 多进程数据共享 管道Pipe 逻辑: 2个进程,各自发送数据到管道,对方从管道中取到数据 总结: 1.只适合两个进 ...
- [b0036] python 归纳 (二一)_多进程数据共享和同步_服务进程Manager
# -*- coding: utf-8 -*- """ 多进程数据共享 服务器进程 multiprocessing.Manager 入门使用 逻辑: 20个子线程修改共享 ...
- [b0041] python 归纳 (二六)_多进程数据共享和同步_事件Event
# -*- coding: utf-8 -*- """ 多进程 同步 事件multiprocessing.Event 逻辑: 子线程负责打印,会阻塞, 等待主进程发出控制 ...
- [b0040] python 归纳 (二五)_多进程数据共享和同步_信号量Semaphore
# -*- coding: utf-8 -*- """ 多进程同步 使用信号量 multiprocessing.Semaphore 逻辑: 启动5个进程,打印,每个各自睡 ...
- [b0039] python 归纳 (二四)_多进程数据共享和同步_锁Lock&RLock
# -*- coding: utf-8 -*- """ 多进程 锁使用 逻辑: 10个进程各种睡眠2秒,然后打印. 不加锁同时打印出来,总共2秒,加锁一个接一个打印,总共 ...
- [b0038] python 归纳 (二三)_多进程数据共享和同步_队列Queue
1 队列读写 # -*- coding: utf-8 -*- """ 多进程 共享 队列 multiprocessing.Process 逻辑: 一个进程往队列写数据, ...
- C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案
C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...
- C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转
原文:C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing ...
- python学习笔记——多进程中共享内存Value & Array
1 共享内存 基本特点: (1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝. (2)为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将 ...
随机推荐
- C#中增量类功能的方式之 继承与扩展
之前一次公司培训的时候,将它记录下来,https://www.cnblogs.com/AlvinLee/p/10180536.html这个博客上面比较全面. 1.扩展方法 扩展方法是一种特殊的静态方法 ...
- JAVA学习第二步,初级知识框架梳理
回顾往期的学习,才发现已经学习了这么多知识点.这里复制了其他创作者的一些梳理结合自己的梳理.总结了自己在Java学习入门阶段的知识点.笔记自己了也写了详细的两本 第一章 Java面向对象 1-1包的定 ...
- SSM框架之SpringMVC(1)入门程序
SpringMVC(1) 1.三层架构和MVC 1.1. 三层架构 咱们开发服务器端程序,一般都基于两种形式,一种C/S架构程序,一种B/S架构程序 使用Java语言基本上都是开发B/S架构的程序,B ...
- springcloud 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...
- DBUtils框架的使用(上)
昨天做了这么多的铺垫,当然就是为了引出今天的DBUtils框架了,它的实现原理跟我们编写的简易框架是类似的. 话不多说,进入正题. commons-dbutils 是 Apache 组织提供的一个开源 ...
- mssql sqlserver 添加表注释和添加列注释的方法分享
转自: http://www.maomao365.com/?p=8919 摘要: 下文讲述使用sql脚本对数据表或数据列添加注释(备注说明)的方法分享,如下所示: 实验环境:sql server 2 ...
- RDMA 相关 简要摘录
RDMA (Remote Direct Memory Access) 全称为 远程直接内存访问 其出现的目的:为了解决网络传输中服务端数据处理的延迟而产生的.其将数据直接从一台计算机的内存传输到另一台 ...
- Shell—引入外部脚本文件
在Shell中要如何调用别的shell脚本,或别的脚本中的变量,函数呢? 方式1:. filename 方式2:source filename 需要注意: 两个点之间 ...
- 以太网驱动的流程浅析(五)-mii_bus初始化以及phy id的获取【原创】
以太网驱动的流程浅析(五)-mii_bus初始化以及phy id的获取 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号 ...
- AtCoder Beginner Contest 140
传送门 A - Password 输出\(n*n*n\)即可. Code #include <bits/stdc++.h> using namespace std; typedef lon ...