繁体   English   中英

Python共享内存,如何将随机整数放入共享内存块?

[英]Python shared memory, how can I put the random integer into the shared memory block?

我创建了一个字节大小为 10 的内存块,并想创建一个随机数并将其放入内存块中,但它总是给我错误消息,所以我想知道我是否做错了。

from multiprocessing import shared_memory
import random

shared_mem_1 = shared_memory.SharedMemory(create=True, size=10)
num = (random.sample(range(1, 1000), 10))
for i, c in enumerate(num):
    shared_mem_1.buf[i] = c

错误信息:

回溯(最近一次通话最后):

文件“main.py”,第 7 行,在 shared_mem_1.buf[i] = c

ValueError:memoryview:格式“B”的无效值

问题是num包含超过 255 的值,并且当它被分配给buf时,出现格式'B'错误的无效值 格式B正是字节的格式(在此处查看格式表)。

有2个选项:

  1. 将随机数的范围更改为 0 到 255 之间; 或者,
  2. 使用int.to_bytes函数转换为字节。

选项1

from multiprocessing import shared_memory
import random

shared_mem_1 = shared_memory.SharedMemory(create=True, size=10)
num = (random.sample(range(0, 255), 10))
for i, c in enumerate(num):
    shared_mem_1.buf[i] = c
shared_mem_1.unlink()

选项 2

对于选项 2,您需要注意字节顺序(大端/小端)以及在您的情况下整数有多少字节(此外,要分配的内存量取决于此长度)。 对缓冲区的分配应该计算它已经保存的偏移量。

from multiprocessing import shared_memory
import random

int_length = 4
shared_mem_1 = shared_memory.SharedMemory(create=True, size=int_length * 10)
num = (random.sample(range(1, 1000), 10))
for i, c in enumerate(num):
    pos = i*int_length
    shared_mem_1.buf[pos:pos+int_length] = c.to_bytes(int_length, 'big')
shared_mem_1.unlink()

我发现利用multiprocessing.shared_memory最有用的方法是创建一个使用共享内存区域作为内存缓冲区的 numpy 数组。 Numpy 处理设置正确的数据类型(它是 8 位整数吗?32 位浮点数?64 位浮点数?等等)以及提供方便的接口(类似,但比 python 的内置array模块更可扩展)。 这样,对数组的任何修改在任何具有映射到数组的相同内存区域的进程中都是可见的。

from multiprocessing import Process
from multiprocessing.shared_memory import SharedMemory
import numpy as np

def foo(shm, shape, dtype):
    arr = np.ndarray(shape, dtype, buffer = shm.buf) #remote version of arr
    print(arr)
    arr[0] = 20 #modify some data in arr to show modifications cross to the other process
    shm.close() #SharedMemory is internally a file, which needs to be closed.

if __name__ == "__main__":
    shm = SharedMemory(create=True, size=40) #40 bytes for 10 floats
    arr = np.ndarray([10], 'f4', shm.buf) #local version of arr (10 floats)
    arr[:] = np.random.rand(10) #insert some data to arr
    p = Process(target=foo, args=(shm, arr.shape, arr.dtype)
    p.start()
    p.join() #wait for p to finish
    print(arr) #arr should reflect the changes made in foo which occurred in another process.
    shm.close() #close the file
    shm.unlink() #delete the file (happens automatically on windows but not linux)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM