Python shared_memory写入随机整数到共享内存块报错如何解决?
错误原因
报错ValueError: memoryview: invalid value for format 'B'的核心原因是:multiprocessing.shared_memory.SharedMemory实例的buf属性默认是格式为B(无符号单字节)的内存视图,仅支持写入**0255区间的整数**。你的代码生成的随机数范围是11000,大量数值超出单字节可承载的最大值255,赋值时直接触发类型校验错误。
正确写入方法
根据你实际要存储的数值范围,选对应方案即可:
方案1:存储0~255范围的整数(匹配10字节内存大小)
如果你不需要存大于255的数,直接把随机数生成范围调整到单字节合法区间即可,10字节刚好存10个数值:
from multiprocessing import shared_memory import random # 创建10字节共享内存块 shared_mem_1 = shared_memory.SharedMemory(create=True, size=10) # 生成10个0~255区间的不重复随机数 num_list = random.sample(range(0, 256), 10) # 逐字节写入 for idx, value in enumerate(num_list): shared_mem_1.buf[idx] = value # 验证读取结果 print("写入结果:", [shared_mem_1.buf[i] for i in range(10)]) # 用完必须清理资源,避免共享内存泄漏 shared_mem_1.close() shared_mem_1.unlink()
方案2:存储1~1000范围的整数
1000以内的整数至少需要2字节存储(2字节无符号整数支持范围0~65535,完全覆盖需求),此时需要调整申请的共享内存大小,借助标准库struct完成整数和字节的转换再写入:
from multiprocessing import shared_memory import random import struct # 10个2字节整数共需20字节内存 shared_mem_1 = shared_memory.SharedMemory(create=True, size=2 * 10) num_list = random.sample(range(1, 1000), 10) # 将整数列表打包为2字节无符号短整型格式,直接写入共享内存 struct.pack_into(f'{len(num_list)}H', shared_mem_1.buf, 0, *num_list) # 验证读取结果 read_result = list(struct.unpack_from(f'{len(num_list)}H', shared_mem_1.buf, 0)) print("写入的1~1000范围随机数:", read_result) # 清理资源 shared_mem_1.close() shared_mem_1.unlink()
注意事项
- 共享内存不会随进程退出自动释放,用完必须先调用
close()关闭当前进程对内存块的连接,再调用unlink()删除系统层面的共享内存段,否则会造成资源残留。 - 写入的字节总长度不能超过申请的共享内存大小,否则会触发越界错误。
内容的提问来源于stack exchange,提问作者Sargis
相关产品推荐
相关产品推荐

