zoukankan      html  css  js  c++  java
  • python 进程间通信(下)

    利用 Value,Array   先说明这个方法并不常用,因为有更灵活的方法

    from multiprocessing import  Process,Value,Array
    
    
    def f(n,a,not_share):
        n.value=3.141
        for i in range(len(a)):
            a[i]=-a[i]
    #更改共享内存 not_share.append(
    999) print 'not_share:',not_share if __name__ == '__main__': #这个是一个普通的列表 not_share=[1000] #这个是导入的方法,可以进程共享内存的,’d‘代表数字并不是随便写的。后面的值也必须是数字 num=Value('d',123) #这里的’i‘代表列表,不是随便写的。利用这个方法可以进程间共享 arr = Array('i',range(10)) #启动子进程 p=Process(target=f,args=(num,arr,not_share)) p.start() p.join() #可以通过这里的输出看出子进程将这个变量的值改了,注意 num.value,和正常的变量有所不同 print num.value #这里和以前打印列表的方式也不一样,方法都被改造了所以才能实现进程间的共享 print arr[:] #这里打印普通的列表,发现进程间无法更改内存 print 'not_share:',not_share

    显示内容:

    not_share: [1000, 999]       子进程里面修改成功,但是看下面父进程返回的值。并没有修改
    3.141           共享内存已经被修改了
    [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]           共享内存已经被修改了
    not_share: [1000]                           父进程打印的列表,子进程并没有修改内存成功

    利用  manager方法:

    可以支持的数据类型很多,列表、字典、锁、变量、信号、队列等。

     1 #_*_coding:utf-8_*_
     2 from multiprocessing import  Process,Manager
     3 
     4 def f(d,l):
     5     d[1]='1'
     6     d['2']=2
     7     #将列表内容反转
     8     l.reverse()
     9 
    10 
    11 if __name__ == '__main__':
    12     #先定义一下
    13     manager=Manager()
    14     #利用manager方法生成一个空字典
    15     d=manager.dict()
    16     #利用manager方法生成一个列表
    17     l=manager.list(range(10))
    18     
    19     p=Process(target=f,args=(d,l))
    20     p.start()
    21     p.join()
    22      
    23     print d
    24     print l

    显示内容:

    {1: '1', '2': 2}
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

    父进程中定义的字典和列表内容全部被子进程更改掉了

    结论:

    父进程和子进程内存中肯定是独立的,它们之间的修改就是借助第三方桥梁完成。并不是正真意义上的共享,manager是自带进程锁,在进行修改的时候不必担心多进程同时进行修改的问题。线程才是真正意义上的共享一个内存区域,但

    线程不自带锁必须自己加锁。    

    manager比较灵活可以实现不同主机间的进程共享(听着好像很牛逼),但是效率没有Value,Array 高

  • 相关阅读:
    排序:归并排序
    错误编码 = 10022 错误消息 = SDK 组件 Qupaisdk 启动出错,错误消息为 [Qupaisdk], the android stack error message is Fail to start the plugin, which is caused by No implem
    关于百川趣拍64位的问题
    在 APK 中找不到对应的 securityguard***.so 文件或者 so 文件载入出错
    趣拍proguard配置
    android多国语言文件夹
    错误编码 = 17
    阿里百川趣拍接入指南
    Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65536
    Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65536
  • 原文地址:https://www.cnblogs.com/menkeyi/p/5822082.html
Copyright © 2011-2022 走看看