Python 进程之间共享内存(使用 `ctype` 对象)

Python 进程之间共享内存(使用 `ctype` 对象)

Python 进程之间共享内存(使用 ctype 对象)

在这种情况下,会创建一个 共享内存块,进程可以访问这个共享内存块。在我们初始化在 multiprocessing 包中可见的 ctype 数据类型之一时,共享内存就被创建了。这些数据类型是 ArrayValueArray 数据类型是 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 对象的使用,我们将创建一个大小是 3ctype 数组,用来保存原始数组增加值后的数组。我们还创建了一个 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
主进程退出。

<完>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dowhileprogramming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值