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的更多相关文章

  1. [b0037] python 归纳 (二二)_多进程数据共享和同步_管道Pipe

    # -*- coding: utf-8 -*- """ 多进程数据共享 管道Pipe 逻辑: 2个进程,各自发送数据到管道,对方从管道中取到数据 总结: 1.只适合两个进 ...

  2. [b0036] python 归纳 (二一)_多进程数据共享和同步_服务进程Manager

    # -*- coding: utf-8 -*- """ 多进程数据共享 服务器进程 multiprocessing.Manager 入门使用 逻辑: 20个子线程修改共享 ...

  3. [b0041] python 归纳 (二六)_多进程数据共享和同步_事件Event

    # -*- coding: utf-8 -*- """ 多进程 同步 事件multiprocessing.Event 逻辑: 子线程负责打印,会阻塞, 等待主进程发出控制 ...

  4. [b0040] python 归纳 (二五)_多进程数据共享和同步_信号量Semaphore

    # -*- coding: utf-8 -*- """ 多进程同步 使用信号量 multiprocessing.Semaphore 逻辑: 启动5个进程,打印,每个各自睡 ...

  5. [b0039] python 归纳 (二四)_多进程数据共享和同步_锁Lock&RLock

    # -*- coding: utf-8 -*- """ 多进程 锁使用 逻辑: 10个进程各种睡眠2秒,然后打印. 不加锁同时打印出来,总共2秒,加锁一个接一个打印,总共 ...

  6. [b0038] python 归纳 (二三)_多进程数据共享和同步_队列Queue

    1  队列读写 # -*- coding: utf-8 -*- """ 多进程 共享 队列 multiprocessing.Process 逻辑: 一个进程往队列写数据, ...

  7. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案

    C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...

  8. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转

    原文:C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing ...

  9. python学习笔记——多进程中共享内存Value & Array

    1 共享内存 基本特点: (1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝. (2)为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将 ...

随机推荐

  1. Docker 镜像与容器

    镜像和容器的关系   容器提交    commint 作用:       根据容器生成一个新的镜像        命令格式:       docker commit [OPTIONS] CONTAIN ...

  2. SpringCloud(七):springcloud-config统一管理配置中心

    前言: Spring Cloud Config组件是独立的,不需要注册到eureka.config工作原理是把读取目标到配置拉取到本地缓存一份然后供给其他客户端使用,所以一旦config启动成功,可以 ...

  3. 松软科技web课堂:SQLServer之ROUND() 函数

    ROUND() 函数 ROUND 函数用于把数值字段舍入为指定的小数位数. SQL ROUND() 语法 SELECT ROUND(column_name,decimals) FROM table_n ...

  4. JS Switch

    JS Switch switch 语句用于基于不同的条件来执行不同的动作. switch(n) { case 1: 执行代码块 1 break; case 2: 执行代码块 2 break; defa ...

  5. PC/SC双界面读写器开发指南

    友我科技PCSC双界面读写器YW-606开发指南 1.建立资源管理器的上下文 函数ScardEstablishContext()用于建立将在其中进行设备数据库操作的资源管理器上下文(范围). 函数原型 ...

  6. WORD 和Uint16的区别

    UINT   A 16-bit unsigned integer on Windows versions 3.0 and 3.1; a 32-bit unsigned integer on Win32 ...

  7. MySQL数据库:基本操作及增删改查语句

    基本语法&&操作语句 create(创建) alter(更新) drop(删除) 一次性删除一个表中所有的数据 包括日志 truncate table 表名; 选中或者使用该数据库 说 ...

  8. tomcat修改进程名称

    1.window平台: 打开tomcat_home\bin\setclasspath.bat文件,找到set _RUNJAVA=”%JRE_HOME%\bin\java”这一行. 将该行注释掉 ,然后 ...

  9. golang数据结构之递归解决迷宫问题

    简单来说:递归就是函数/方法自己调用自己,只是每次传入不同的变量. 递归可以解决各种数学问题:n皇后问题.阶乘问题.汉诺塔.迷宫问题.球和篮子问题等等: maze.go package maze im ...

  10. golang--redis基本介绍

    redis(remote-dictionary-system)即远程字典服务器,是NoSQL数据库: 适合做缓存以及持久化: 免费开源,高性能的分布式内存数据库: redis的安装和使用: 下载Red ...