[英]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个选项:
int.to_bytes
函数转换为字节。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,您需要注意字节顺序(大端/小端)以及在您的情况下整数有多少字节(此外,要分配的内存量取决于此长度)。 对缓冲区的分配应该计算它已经保存的偏移量。
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.