鱼C论坛

 找回密码
 立即注册
查看: 1600|回复: 10

我想在多进程里 共享 多维数组 的内存

[复制链接]
发表于 2022-3-12 22:37:21 | 显示全部楼层 |阅读模式
10鱼币
1、我想在多进程里 共享 多维数组 的内存

2、这个数组是可以 读 + 写 的

我找到挺多的教程好像都只能读不能写

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-12 23:13:52 | 显示全部楼层
不能用于Pool,只能用于Process
from multiprocessing import Process, Value, Array

def test(num, mystr, arr):
    # 修改整型
    num.value *= 2

    # 修改字符数组
    for i in range(len(mystr)):
        mystr[i] = '1'

    # 修改浮点型数组
    for i in range(len(arr)):
        arr[i] = arr[i] * 2
 
def showVars(num, myStr, floatArr):
    print('整型: ', num.value)
    print('字符数组: ', myStr[:])
    print('浮点型数组: ', floatArr[:])
 
if __name__=='__main__':
    # 初始化
    num = Value('i', 2) # 整型
    myStr = Array('u', "http://www.1118pc.com") # 字符串(字符数组) 使用'u'
    floatArr = Array('d', [1.0, 1.5, -2.0]) # 浮点型 数组

    print('==================初始化:==================')
    showVars(num, myStr, floatArr)

    # 开启3个进程
    ps = [Process(target=test, args=(num, myStr, floatArr)) for x in range(3)]
    for p in ps:
        p.start()
    for p in ps:
        p.join()
    print()
    print('==================经过子进程修改后:==================')
    showVars(num, myStr, floatArr)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-13 18:00:57 | 显示全部楼层
ba21 发表于 2022-3-12 23:13
不能用于Pool,只能用于Process

二维数组呢?二维数组我想共享内存,一维度的没问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-13 18:34:37 | 显示全部楼层
拽猫的尾巴 发表于 2022-3-13 18:00
二维数组呢?二维数组我想共享内存,一维度的没问题

有1维的列子不会用2维?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-13 18:51:42 | 显示全部楼层
拽猫的尾巴 发表于 2022-3-13 18:00
二维数组呢?二维数组我想共享内存,一维度的没问题



转成1维,内部你想当2维使用,你在内部在转城2维。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-14 14:34:10 | 显示全部楼层
ba21 发表于 2022-3-13 18:51
转成1维,内部你想当2维使用,你在内部在转城2维。

每曾设想过的道路
Array只能一维把我思路锁死了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-14 15:12:24 | 显示全部楼层
ba21 发表于 2022-3-13 18:51
转成1维,内部你想当2维使用,你在内部在转城2维。

试了下,现在有点不理解的你话

在内部转成2维的意思是在你的floatArr = Array('d', [[[1.0, 1.5, -2.0],[1.0,2.0,3.0]]])的意思吗
我这样做报错了:TypeError: must be real number, not list

我也试了下把 pandas 的 dataframe 放进去,
但是报错了:TypeError: must be real number, not DataFrame
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-14 19:24:59 | 显示全部楼层
拽猫的尾巴 发表于 2022-3-14 15:12
试了下,现在有点不理解的你话

在内部转成2维的意思是在你的floatArr = Array('d', [[[1.0,  ...

python 多进程,只支持1维。
数组这东西不管几维,它都是1维没错吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-15 15:16:43 | 显示全部楼层
ba21 发表于 2022-3-14 19:24
python 多进程,只支持1维。
数组这东西不管几维,它都是1维没错吧。

但是如果在list里在添加个list,Array的第一个参数好像没有合适的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-15 15:22:45 | 显示全部楼层
拽猫的尾巴 发表于 2022-3-15 15:16
但是如果在list里在添加个list,Array的第一个参数好像没有合适的

是的,python 数组的表现形式是 list 。
所我我早说了,在调用多进程前你把多维数组转1维,在每个进程中如果你要以多维的形式操作,你再把1维转多维。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-15 22:20:56 | 显示全部楼层
拽猫的尾巴 发表于 2022-3-15 15:16
但是如果在list里在添加个list,Array的第一个参数好像没有合适的


他的意思大概是这样:
arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]    # 一维,在 Array 里用这个
print(f'一维:{arr1}')
arr2 = list(map(list, zip(*[iter(arr1)] * 3)))   # 二维,在进程内部转换成二维使用
print(f'二维:{arr2}')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 16:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表