Python 进程之间共享内存(使用 `ctype` 对象)
Python 进程之间共享内存(使用 ctype
对象)
在这种情况下,会创建一个 共享内存块
,进程可以访问这个共享内存块。在我们初始化在 multiprocessing
包中可见的 ctype
数据类型之一时,共享内存就被创建了。这些数据类型是 Array
和 Value
。 Array
数据类型是 ctype
数组,Value
数据类型是泛型 ctype
对象。下面的代码演示了如何创建一个 ctype
数组:
myList = multiprocessing.Array('i', 5)
这行代码会创建一个有 5 个整数的数组。i
是类型代码之一,它代表整数。我们使用类型代码 d
代表浮点数。我们还可以提供一个序列,作为第二个实参,初始化数组(取代大小):
myList = multiprocessing.Array('i', [0, 1, 2, 3, 4])
用下面的语句,可以创建一个 Value
ctype
对象:
obj = multiprocessing.Value('i')
这会创建一个整数类型的对象,因为使用了类型代码 i
。这个对象的值,可以使用 value
属性访问或设置。
这两个 ctyle
对象都有 Lock
这个可选实参,默认被设置为 True
。当这个实参被设置为 True
时,被用来创建一个新的递归锁,对对象的值提供同步访问。如果这个实参被设置为 False
,就没有保护了,并且进程也不是安全的了。如果你的进程是以只读的方式访问共享内存,把 Lock
设置为 False
是可以的。在后的例子中,我们使用 Lock
的默认值 True
。
为了演示 ctye
对象的使用,我们将创建一个大小是 3
的 ctype
数组,用来保存原始数组增加值后的数组。我们还创建了一个 ctype
对象用来保存增加值后的数组的元素的和。这些对象由父进程在共享内存中创建,并且被子进程访问和更新。下面是完整的代码:
import multiprocessing
from multiprocessing import Process, Pool, current_process as cp
def inc_sum_list(list, inc_list, sum):
sum.value = 0
for index, num in enumerate(list):
inc_list[index] = num + 1
sum.value += inc_list[index]
def main():
my_list = [2, 5, 7]
inc_list = multiprocessing.Array('i', 3)
sum = multiprocessing.Value('i', 0)
p = Process(target=inc_sum_list, args=(my_list, inc_list, sum))
p.start()
p.join()
print("增加后的数组:", list(inc_list))
print("和是:", sum.value)
print("主进程退出。")
if __name__ == '__main__':
main()
运行结果是:
增加后的数组: [3, 6, 8]
和是: 17
主进程退出。
<完>