# 共享内存时间戳机制说明 ## 问题背景 原始实现中,Python 端每 30 秒更新一次共享内存数据,而 Go 客户端每秒读取一次。由于共享内存中的数据不会自动清除,Go 客户端每次读取的都是同一份旧数据,导致看起来像是每秒都收到了新行情。 ## 解决方案:时间戳版本检测 ### 核心思路 在共享内存头部添加**时间戳字段**,Go 客户端通过检测时间戳变化来判断数据是否真正更新。 ### 共享内存头部结构(16字节) ``` 偏移量 | 字段名 | 类型 | 说明 --------|---------------|--------|------------------ 0-3 | version | uint32 | 版本号(当前为1) 4-7 | write_pos | uint32 | 写入位置指针 8-11 | last_data_len | uint32 | 最后一条数据的长度 12-15 | timestamp | uint32 | Unix 时间戳(秒级) ``` ### 工作流程 #### Python 端(生产者) 1. 每次调用 `publish_tick()` 时: - 序列化数据并写入共享内存 - **更新头部时间戳为当前 Unix 时间戳** 2. 关键代码位置:`src/qmt/tick_push.py` 第 93-97 行 ```python # 更新写入位置、最后数据长度和时间戳 new_pos = current_pos + 4 + data_len timestamp = int(time.time()) # Unix 时间戳 struct.pack_into('