进程间的通信----------共享内存

1.定义

     共享内存时最简单的通信方式,他允许多个进程访问相同的内存,一个进程改变其中数据后,其他进程可以看到数据的变化

2.画图理解

     

     已经有两个进程A和B,在内存中开辟一个空间为C,C就是共享内存,进程A把消息传入到共享内存C中,进程B及时接收了,那么你收到的就是进程A传输的消息,如果进程B没有收取的话,进程A第二次把消息传入到共享内存C中,第二次传入的消息就会覆盖掉第一次传入的消息,进程B这个时候收取消息,只能收取到第二次传入的消息,换句话说共享内存中的消息不存在一条两条,永远时最新存放的消息。

3.特点

     在内存中开辟一个内存空间存储数据,每次存储的内容都会覆盖上次的内容。由于没有对内存进行格式化的修饰,所以存取速度快,效率高

4.创建共享内存通信

   1.方法一  multiprocessing ---------value(传入单个值)

          

    from multiprocessing import Value,Process
    from time import sleep
    import random

    #写一个存钱函数
    def save_money(money):
        #做100次存钱的动作
        for i in range(100):
            sleep(0.03)
            money.value += random.randint(1,200)
    #取钱函数
    def take_money(money):
        for i in range(100):
            sleep(0.02)
            money.value -= random.randint(1,150)


    if __name__ == '__main__':
        #开辟共享内存空间
        money = Value('i',2000)
        d = Process(target=save_money,args=(money,))
        w = Process(target=take_money,args=(money,))
        d.start()
        w.start()
        d.join()
        w.join()
        print(money.value)
     解析:

                      

该程序顺序执行,直到money=Value('i',2000)的时候创建了共享内存,money是共享内存空间生成的一个对象,这个对象有个属性就是
value值为2000,再往下d和w是两个子进程,两个子进程当中把money这个共享内存传入进去了,然后在子进程中操作两个money.value
如果操作的是同一块东西,那么他们相互之间都是可见的(因为存取函数都是操作的2000这个数),存取子进程函数和主进程函数都能
获取到2000这个数,形成了三个函数都可以对这个共享内存进行操作,所以另外两个进程的操作会影响到主进程的操作

        看到这如果还不明白那么就画张图

         

      现在有一个主进程,主进程创建了一个内存空间,然后我们子啊共享内存空间里存放了一个数字2000,然后创建了两个子进程A,B,那么现在A进程操作共享内存的负责往进存钱,那么现在存钱的进程开始运行,取钱的进程就在旁边等待,存进去1块钱那么共享内存就变成2001了结束后,那么B进程也去操作共享内存,那么这个时候共享内存就是2001了,B进程是负责取钱,如果取出1块,那就是2000了,直到两个子进程结束退出,退出后主进程读取共享内存目前的值。子进程操作后的值被主进程读取到,这就是进程间的通信。全局变量肯定是做不到这点的,用全局变量的话子进程的操作是不会影响主进程的,因为他是把2000分别复制到自己的空间去随意操作,父进程最后读取还是2000。

      过程搞明白后,再来看看money = value('i',2000)中i是什么?共享内存的开辟,你要在共享内存里存储数据的话,不能存放python格式的数据,只能存放C语言格式的数据,所以i的作用就是把python格式的2000转换成C语言的格式,i代表整形

    2.方法二 Array 传入多个值

          obj = Array(ctype,obj)

          功能:开辟一个共享内存空间

          参数:要转换的C的类型

                    obj 放入共享内存中的数据,是一个列表,要求列表中的数据为相同类型的数据

    

    from multiprocessing import Array

    def func(shm):
        print(shm)
        for i in shm:
            print(i)
        shm[0] = 1000



    if __name__ == '__main__':
        shm = Array('i',[1,2,3,4,5])
        p = Process(target=func,args=(shm,))
        p.start()
        p.join()
        for i in shm:
            print(i)
  解析:Array就是创建了共享内存,值为列表,在子进程中对列表中的第一个元素做出了改变,主进程打印的时候也发生了改变,这就是通信。


猜你喜欢

转载自blog.csdn.net/weixin_39859512/article/details/80928151
今日推荐