• [b0035] python 归纳 (二十)_多进程数据共享和同步_共享内存Value & Array


      

    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 " ",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 " ",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]
    View Code

     

    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,那么对返回的对象的访问不会被锁自动保护,因此它不一定是“进程安全的”

  • 相关阅读:
    [fw]error: aggregate value used where an integer was expected
    [fw]awk求和
    [fw]谈EXPORT_SYMBOL使用
    [fw]用Kprobes调试(debug)内核
    [FW]使用kprobes查看内核内部信息
    linux缺頁異常處理--內核空間[v3.10]
    用C语言给指定的内存地址赋值(通过指针)
    [fw]Linux 的 time 指令
    how to prevent lowmemorykiller from killing processes
    Android成长日记-Noification实现状态栏通知
  • 原文地址:https://www.cnblogs.com/sunzebo/p/9634245.html
Copyright © 2020-2023  润新知