1 共享内存

基本特点:

(1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。

(2)为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率。(文件映射

(3)由于多个进程共享一段内存,因此也需要依靠某种同步机制。

优缺点:

优点:快速在进程间传递数据

缺点: 数据安全上存在风险,内存中的内容会被其他进程覆盖或 者篡改

注: 经常和同步互斥配合使用

2 基本语法

共享内存要符合C语言的使用语法

 from multiprocessing import Value , Array 

Value:将一个值存放在内存中,

Array:将多个数据存放在内存中,但要求数据类型一致

补充:数据类型

Type code C Type Python Type Minimum size in bytes Notes
'b' signed char int 1  
'B' unsigned char int 1  
'u' Py_UNICODE Unicode character 2 (1)
'h' signed short int 2  
'H' unsigned short int 2  
'i' signed int int 2  
'I' unsigned int int 2  
'l' signed long int 4  
'L' unsigned long int 4  
'q' signed long long int 8 (2)
'Q' unsigned long long int 8 (2)
'f' float float 4  
'd' double float 8  

具体参考:8.7. array — Efficient arrays of numeric values

2.1 Value

Value(typecode_or_type, *args, lock=True)

功能 : 得到一个共享内存对象,并且存入初始值,method of multiprocessing

返回Returns a synchronized shared object(同步共享对象)

typecode_or_type:定义了返回类型(转换成C语言中存储类型),它要么是一个ctypes类型,要么是一个代表ctypes类型的code。

*args:开辟一个空间,并赋一个args值,值得类型不限

注:ctypes是python的一个外部函数库,它提供了和C语言兼容的数据类型,可以调用DLLs或共享库的函数,能被用作在python中包裹这些库。

from multiprocessing import Process,Value
import time
import random

def save_money(money):
    for i in range(100):
        time.sleep(0.1)
        money.value += random.randint(1,200)

def take_money(money):
    for i in range(100):
        time.sleep(0.1)
        money.value -= random.randint(1,150)

# money为共享内存对象,给他一个初始值2000,类型为正型“i”
# 相当于开辟了一个空间,同时绑定值2000,
money = Value('i',2000)

d = Process(target=save_money,args=(money,))#这里面money是全局的,不写也可
d.start()
w = Process(target=take_money,args=(money,))#这里面money是全局的,不写也可
w.start()

d.join()
w.join()

print(money.value)

运行 4491

2.2 Array

Array(typecode_or_type, size_or_initializer, *, lock=True)

使用基本类似于Value,Returns a synchronized shared array

typecode_or_type:定义转换成C语言的存储类型;

size_or_initializer:初始化共享内存空间,

若为数字,表示开辟的共享内存中的空间大小,(Value表示为该空间绑定一个数值)

若为数组,表示在共享内存中存入数组

from multiprocessing import Process,Array

def fun(m,n):
    for i in range(n):
        print(m[i])

# 此处不表数字8类型为整型'i';
# 表示开辟8个空间,且均为整型i,其实就是一个列表
m = Array('i',3)

p = Process(target= fun,args=(m,4))
p.start()

p.join()

运行

0 0 0
Process Process-1:
....
IndexError: invalid index

说明:三个0表示开辟的共享内存容量为3,当再超过3时就会报错。

示例2

from multiprocessing import Process,Array
import time

def fun(m,n):
    for i in range(n):
        m[i]=i

m = Array('i',5)

p = Process(target= fun,args=(m,5))
p.start()

time.sleep(1)
for i in m:
    print(i)

p.join()

运行结果

0 1 2 3 4

如果将 time.sleep(1) 去掉,则输出结果均为0,原因就是还未赋值就已经打印了。

from multiprocessing import Process,Array
import time

def fun(m,n):
    for i in range(n):
        print(m[i])
        m[i]=i

# 此处表示开辟5个空间,同时存入列表中的元素
m = Array('i',[1,2,3,4,5])

p = Process(target= fun,args=(m,5))
p.start()

time.sleep(1)
for i in m:
    print(i)

p.join()

运行

1 2 3 4 5
0 1 2 3 4

第二个参数如果传入一个数字,则表示在共享内存中开辟多大的空间,

如果传入的是列表,则开辟响应元素数量的共享空间容量,并将其直接存入共享空间

python学习笔记——多进程中共享内存Value & Array的更多相关文章

  1. python学习笔记——多进程中的锁Lock

    1 进程锁 python编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性. 每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一线程访问对象. 在python中我 ...

  2. python学习笔记—— 多进程中的 孤儿进程和僵尸进程

    1 基本概述 1.1 孤儿进程和僵尸进程 父进程创建子进程后,较为理想状态是子进程结束,父进程回收子进程并释放子进程占有的资源:而实际上,父子进程是异步过程,两者谁先结束是无顺的,一般可以通过父进程调 ...

  3. Python 学习笔记 多进程 multiprocessing--转载

    本文链接地址 http://quqiuzhu.com/2016/python-multiprocessing/ Python 解释器有一个全局解释器锁(PIL),导致每个 Python 进程中最多同时 ...

  4. python 学习笔记 多进程

    要让python程序实现多进程,我们先了解操作系统的相关知识 Unix/Linux操作系统提供了一个fork()系统调用,他非常特殊,普通的函数调用,调用一次,返回一次,但是fork调用一次, 返回两 ...

  5. python学习笔记-多进程

    multiprocessing from multiprocessing import Process import time def f(name): time.sleep(2) print('he ...

  6. Python学习笔记6-Python中re(正则表达式)模块学习

    今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. re.match re.match 尝试从 ...

  7. python学习笔记——多进程一 基础概念

    1 进程 进程:程序的一次(从开始到结束)执行过程,属于一个动态过程.是系统进行资源分配和调度的基本单位. 程序:指的是一个文件,磁盘中可执行的代码.属于一个静态文件 注:进程运行时需要把程序加载如内 ...

  8. python学习笔记——爬虫中提取网页中的信息

    1 数据类型 网页中的数据类型可分为结构化数据.半结构化数据.非结构化数据三种 1.1 结构化数据 常见的是MySQL,表现为二维形式的数据 1.2 半结构化数据 是结构化数据的一种形式,并不符合关系 ...

  9. python学习笔记——多进程二 进程的退出

    1 进程的退出函数的基础语法 1.1 进程的退出函数 进程的退出含有有os._exit([status])和sys.exit([status])两种,从数据包来看,该退出模块仅在linux或者unix ...

随机推荐

  1. 我所遭遇过的中间件--3D MAX SDK

    搞图形的人都知道3D MAX,而3D MAX SDK就是在该软件基础上的一套软件开发包.至于该不该将3D MAX SDK归纳为中间件,不要在意这细节了,反正我觉得SDK和中间件就差不多是一个东西.实际 ...

  2. 【Dagger2】 案例大全

    只有Inject是不可以的,必须有Component public class Test { @Inject Person person; private void test() { System.o ...

  3. IOS UITableView分组列表

    UITableView有两种风格:UITableViewStylePlain和UITableViewStyleGrouped.这两者操作起来其实并没有本质区别,只是后者按分组样式显示前者按照普通样式显 ...

  4. HTML-<td> 标签的 valign 属性

    <html> <body> <table border="1" style="height:200px"> <tr&g ...

  5. Angular6

    Structural Directives https://angular.io/guide/structural-directives#template-input-variable There a ...

  6. mongo文本搜索的一个例子

      假如有一个名为articles的集合,数据如下: { "_id" : 1, "title" : "cakes and ale" } { ...

  7. Python标准库:内置函数abs(x)

    返回数字的绝对值. 參数能够是整数或浮点数.假设參数是复数,则返回复数的模. 因此abs()函数的注意点就是复数的不一样计算方式. 样例: #正整数 print('abs(1):', abs(1)) ...

  8. 如何使用Replace Pioneer批量查找和替换并提取指定字符串

    1 我们查看源代码之后获得的网页文件如下图所示,一般都是href="/p-286018571.html"我们只要能提取到所有的"/p-XXXXXXXX.html" ...

  9. SqlServer日常积累(二)

    1.Like运算符:将字符串表达式与 SQL表达式中的模式进行比较匹配. 语法 :expression Like 'pattern' ,expression为匹配字段,pattern为匹配字符串.可以 ...

  10. Web 应用性能提升的 10 个建议

    建议一.利用反向代理服务器加速和保护应用 如果 Web 应用运行在一台独立的电脑上,性能问题的解决方案是显而易见的:换一台更快的电脑,里面加上更多的处理器.内存.快速磁盘阵列等等.然后在这台新电脑上运 ...