python进程间通信_python笔记45:进程间通信机制-共享内存

主要内容:

  • 小目标:掌握进程间通信方式
  • 主要内容:共享内存

一个问题:有没有一种方式,多个进程可以同时访问修改同一个变量?

回到:有的,共享内存;

  • 共享内存:

多个进程可以直接读写一块公共内存,不需要数据拷贝。

  • 实现原理:

为了在多个进程间交换信息,内核提供一种映射机制;

多个进程就可以直接读写一块公共内存地址而不需要进行数据的拷贝;

  • 优点:速度快,使用方便
  • 缺点:同步问题

1.Python中的共享内存对象:Value与Array

  • Value与Array:
from multiprocessing import Value , Array Value:Value(typecode_or_type, *args, lock=True)Array:Array(typecode_or_type, size_or_initializer, *, lock=True)typecode_or_type:遵循C语言数据格式
  • 数据类型如下:
939fbd9a83766f0cc3f52e2af64ae921.png

数据类型

2. 基本操作:

Value:

#Value对象val = Value('i',  10)#读取val值print(val.value)#设置val值val.value = 20print(val.value)

结果:10,20

Array:

#Array对象, args为typecode类型的可迭代对象alist = Array('i', [1,2,3,4])#访问:print('alist[1]:', alist[1])#遍历:for val in alist:    print(val)

结果:

alist[1]: 21234

3. 多进程共享内存案例

3.1 两个进程对Value进行操作:

子进程修改Value值,看下父进程中变化:

import multiprocessingfrom multiprocessing import Queuefrom multiprocessing import Value, Arrayg_value = Value('i', 0)#进程函数, 共享内存必须通过参数传入def func(gvalue):    #修改g_value值    gvalue.value = 10if __name__ == "__main__":    print("g_value init value:", g_value.value)    #全局消息队列    main_msgq = Queue()    #消息队列必须通过参数传入到子进程,否则无效    p = multiprocessing.Process(target=func, args=(g_value,))    p.start()    p.join()    print("g_value  end value:", g_value.value)

结果:

g_value init value: 0g_value  end value: 10

3.2 两个进程同时对Value修改

一个例子:

两个进程对Value对象进行操作,初始值为0;

主进程对Value对象加100000次,子进程减100000次,查看最后的值是否为0;

代码如下:

import multiprocessingfrom multiprocessing import Queuefrom multiprocessing import Value, Arrayg_value = Value('i', 0)#进程函数, 共享内存必须通过参数传入def func(gvalue):    i = 0    while i < 100000:        #加1        gvalue.value += 1        i += 1    if __name__ == "__main__":    print("g_value init value:", g_value.value)    #全局消息队列    main_msgq = Queue()    #消息队列必须通过参数传入到子进程,否则无效    p = multiprocessing.Process(target=func, args=(g_value,))    p.start()    i = 0    while i < 100000:        #减1        g_value.value -= 1        i += 1    p.join()    print("g_value  end value:", g_value.value)

尝试多运行几次,会有这样结果:

g_value init value: 0g_value  end value: 2735

分析:

理论上,一个变量同时加减一样次数,值应该不变;

多进程操作为什么会出现这个问题?

两个进程同时对变量gvalue进行操作,就会造成这个问题;

如何来处理? 下一节我们来看下并发编程的同步机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值