鱼C论坛

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

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

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

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

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

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

  8.     # 修改浮点型数组
  9.     for i in range(len(arr)):
  10.         arr[i] = arr[i] * 2

  11. def showVars(num, myStr, floatArr):
  12.     print('整型: ', num.value)
  13.     print('字符数组: ', myStr[:])
  14.     print('浮点型数组: ', floatArr[:])

  15. if __name__=='__main__':
  16.     # 初始化
  17.     num = Value('i', 2) # 整型
  18.     myStr = Array('u', "http://www.1118pc.com") # 字符串(字符数组) 使用'u'
  19.     floatArr = Array('d', [1.0, 1.5, -2.0]) # 浮点型 数组

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

  22.     # 开启3个进程
  23.     ps = [Process(target=test, args=(num, myStr, floatArr)) for x in range(3)]
  24.     for p in ps:
  25.         p.start()
  26.     for p in ps:
  27.         p.join()
  28.     print()
  29.     print('==================经过子进程修改后:==================')
  30.     showVars(num, myStr, floatArr)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

二维数组呢?二维数组我想共享内存,一维度的没问题
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

有1维的列子不会用2维?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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



转成1维,内部你想当2维使用,你在内部在转城2维。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

每曾设想过的道路
Array只能一维把我思路锁死了
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

python 多进程,只支持1维。
数组这东西不管几维,它都是1维没错吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

但是如果在list里在添加个list,Array的第一个参数好像没有合适的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

是的,python 数组的表现形式是 list 。
所我我早说了,在调用多进程前你把多维数组转1维,在每个进程中如果你要以多维的形式操作,你再把1维转多维。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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


他的意思大概是这样:
  1. arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]    # 一维,在 Array 里用这个
  2. print(f'一维:{arr1}')
  3. arr2 = list(map(list, zip(*[iter(arr1)] * 3)))   # 二维,在进程内部转换成二维使用
  4. print(f'二维:{arr2}')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 17:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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