"""
|
共享内存工具
|
"""
|
import multiprocessing
|
|
import msgpack
|
|
# 内容长度数据
|
__HEADER_CONTENT_LENGTH = 6
|
# 编号的位数
|
__HEADER_NUMBER_LENGTH = 4
|
__start_number = 0
|
|
|
def create_array(length=100 * 10000):
|
"""
|
创建共享内存
|
@param length: 长度
|
@param with_number: 是否写入编号
|
@return:
|
"""
|
global __start_number
|
__start_number += 1
|
arr = multiprocessing.Array('c', length)
|
length_str = str(__start_number).zfill(__HEADER_NUMBER_LENGTH).encode()
|
for i in range(__HEADER_NUMBER_LENGTH):
|
arr[i] = length_str[i]
|
return arr
|
|
|
def get_number(arr: multiprocessing.Array):
|
"""
|
获取编号
|
@param arr:
|
@return:
|
"""
|
return int(arr[:__HEADER_NUMBER_LENGTH].decode())
|
|
|
def set_datas(arr: multiprocessing.Array, datas):
|
"""
|
将数据设置到共享内存中
|
@param arr:
|
@param datas:
|
@return:
|
"""
|
st = msgpack.packb(datas)
|
length = len(st)
|
length_str = str(length).zfill(__HEADER_CONTENT_LENGTH).encode()
|
for i in range(__HEADER_CONTENT_LENGTH):
|
arr[__HEADER_NUMBER_LENGTH + i] = length_str[i]
|
arr[
|
__HEADER_NUMBER_LENGTH + __HEADER_CONTENT_LENGTH: __HEADER_NUMBER_LENGTH + __HEADER_CONTENT_LENGTH + length] = st
|
|
|
def read_datas(arr: multiprocessing.Array):
|
"""
|
读取数据
|
@param arr:
|
@return: 原始格式的数据
|
"""
|
length = int(arr[__HEADER_NUMBER_LENGTH:__HEADER_NUMBER_LENGTH + __HEADER_CONTENT_LENGTH].decode())
|
content = arr[
|
__HEADER_NUMBER_LENGTH + __HEADER_CONTENT_LENGTH:__HEADER_CONTENT_LENGTH + __HEADER_NUMBER_LENGTH + length]
|
datas = msgpack.unpackb(content)
|
return datas
|