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)
执行后会输出:
二、使用共享对象 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])
执行后会输出: