多进程系列之Value类和Array类

403 阅读2分钟

multiprocessing中Value和Array的实现原理都是在共享内存中创建ctypes()对象来达到共享数据的目的。两者实现方法大同小异,只是选用不同的ctypes数据类型而已。

1.Value

1.1 构造方法

Value(typecode_or_type: Union[str, Type[_CData]], *args: Any, lock: Union[bool, _LockLike] = ...)

typecode_or_type:定义ctypes()对象的类型,可以传Type code或者C Type,具体数据对照表见1.2

args:传递给typecode_or_type构造函数的参数

lock:默认为True,创建一个互斥锁来限制对Value的访问。如果传入一个锁,将用于同步。如果该值为False,Value的实例将不会被锁保护,即此时不是进程安全的。

1.2 支持的数据类型

Type codeC TypePython TypeMinimum size in bytes
'b'signed charint1
'B'unsigned charint1
'u'wchar_tUnicode character2
'h'signed shortint2
'H'unsigned shortint2
'i'signed intint2
'I(大写的i)'unsigned intint2
'l(小写的l)'signed longint4
'L'unsigned longint4
'q'signed long longint8
'Q'unsigned long longint8
'f'floatfloat4
'd'doublefloat8

2.Array

2.1 构造方法

Array(typecode_or_type: Union[str, Type[_CData]], size_or_initializer: Union[int, Sequence[Any]], *, lock: Union[bool, _LockLike] = ...)

typecode_or_type:定义ctypes()对象的类型,可以传Type code或者C Type,具体数据对照表见2.2

size_or_initializer:如果其值是一个整数,则该值确定数组的长度,且数组被初始化为零。否则该值是用于初始化数组的序列,其长度决定数组的长度。

*:传递给typecode_or_type构造函数的参数

lock:默认为True,创建一个互斥锁来限制对Value的访问。如果传入一个锁,将用于同步。如果该值为False,Value的实例将不会被锁保护,即此时不是进程安全的。

3.使用实例

from multiprocessing import Process, Value, Array
​
​
def f(n, a):
    n.value = 3.14
    a[0] = 5
​
​
if __name__ == '__main__':
    num = Value('d', 0.0)
    arr = Array('i', range(10))
    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()
    print(num.value)
    print(arr[:])

result:

3.14
[5, 1, 2, 3, 4, 5, 6, 7, 8, 9]