• 自学Python 57 多线程开发(七)使用 Connection对象和共享对象 Shared


    ​ Python 使用 Connection对象和共享对象 Shared

    活动地址:CSDN21天学习挑战赛



      本文在多线程开发(五)和(六)的基础上继续学习multiprocessing模块中的内容。


    一、使用 Connection对象

      在Python程序中,Connection 对象允许发送和接收可拾取对象或字符串,它们可以被认为是面向消息的连接套接字。例如在下面的实例文件中,演示了使用Connection对象处理数据的过程。

    from multiprocessing import Pipe
    a,b = Pipe()
    a.send([1,'暑假要结束了!',None])
    print(b.recv())
    b.send_bytes(b'thank you')
    print (a.recv_bytes())
    import array
    arr1 = array.array('i', range(5))
    arr2 = array.array('i', [0] * 10)
    a.send_bytes(arr1)
    count = b.recv_bytes_into(arr2)
    assert count == len(arr1) * arr1.itemsize
    print(arr2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

      执行后会输出:
    在这里插入图片描述

    二、使用共享对象 Shared

      在 Python程序中,可以使用由子进程继承的共享内存创建共享对象,这样会返回从共享内存分配的ctypes对象。共享对象Shared主要句含加下所示的两个核心方法。
      (1) multiprocessing.Value(typecode_or_type,* args, lock=True)
      参数说明如下表所示。

    参数名称描述
    返回值在默认情况下,返回值实际上是对象的同步包装器。对象本身可以通过Value的值属性访问
    参数typecode_or_type确定返回对象的类型,是ctypes类型或array模块使用的类型的一个字符类型代码
    参数*args被传递给类型的构造函数
    参数lock如果lock为 True(默认值),则创建一个新的递归锁对象,以同步对该值的访问。如果lock是 Lock或 RLock 对象,那么它将用于同步对该值的访问。如果lock是False,那么对返回对象的访问将不会被锁自动保护,因此它不一定是“进程安全的”

      (2)multiprocessing.Array(typecode_or_type, size_or_initializer,*, lock=True)
      参数说明如下表所示。

    参数名称描述
    返回值返回从共享内存分配的ctypes数组。在默认情况下,返回值实际上是数组的同步包装器
    typecode_or_type确定返回数组的元素类型,是 ctypes类型或array模块使用的类型的一个字符类型代码
    size_or_initializer如果size_or_initializer是一个整数,则它确定数组的长度,并且数组将初始置零。否则 size_or_initializer是用于初始化数组的序列,其长度决定了数组的长度
    Lock如果lock为 True(默认值),则创建一个新的锁对象,以同步对该值的访问。如果lock是Lock或RLock对象,那么它将用于同步对该值的访问。如果lock是False,那么对返回的对象的访问将不会被锁自动保护,因此它不一定是“进程安全的”。请注意,lock是一个仅关键字的参数

      例如在下面的实例中,演示了使用 Shared 对象将共享内容创建共享ctypes对象的过程。

    from multiprocessing import Process,Lock
    from multiprocessing.sharedctypes import Value, Array
    from ctypes import Structure,c_double
    class Point(Structure):
        _fields_ = [('x', c_double),('y', c_double)]
    def modify(n, x, s, A):
        n.value **= 2
        x.value **= 2
        s.value = s.value.upper()
        for a in A:
            a.x **= 2
            a.y **= 2
    if __name__ == '__main__':
        lock = Lock()
        n = Value('i',7)
        x = Value(c_double, 1.0/3.0, lock=False)
        s = Array ('c', b'hello world', lock=lock)
        A = Array(Point, [(1.875,-6.25), (-5.75,2.0), (2.375,9.5)], lock=lock)
        p = Process(target=modify, args=(n,x,s,A))
        p.start()
        p.join()
        print(n.value)
        print(x.value)
        print(s.value)
        print([(a.x, a.y) for a in A])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

      执行后会输出:
    在这里插入图片描述

  • 相关阅读:
    Kubernetes(k8s)上安装Prometheus和Grafana监控
    SSM框架简单介绍
    Python中可以用三种方法判断文件是否存在
    Spring boot(2)
    【期权系列】基于偏度指数的择时分析
    在CSV文件读取时id读取之后成了‘锘縤d‘,该怎么修改
    Linux高并发服务器开发(四)进程间通信
    超结MOS/低压MOS在微型逆变器上的应用-REASUNOS瑞森半导体
    NDVI时间序列分析之Sen+MK分析全过程梳理
    vue:结合elementUI设计网站登录页
  • 原文地址:https://blog.csdn.net/weixin_46066007/article/details/126455258