Skip to content

v0.3.72

Choose a tag to compare

@litaolemo litaolemo released this 23 Oct 08:20
· 15 commits to main since this release

修复

  • 按线程建的传输连接随线程退出释放(#431,@erlou96 报告)。客户端每条线程第一次 RPC 时自建一条连接,但连接句柄只随进程退出回收:客户端每死一条线程,服务端白留一条连接(background 模式还搭一个工作线程),churn 场景一路积到实例上限后新连接永远建不成——报告里的「内存溢出」实际是服务端的线程/句柄耗尽。现在每条连接按 (ident, token) 注册,线程退出时由 thread-local finalizer 即时关闭,新建连接前再兜底清扫死线程残留;ident 与句柄值都会被系统回收复用,释放必须 token 全等,不会错杀复用位上的活连接。
  • trader.stop() 关闭底层 RPC transport(#431 同案)。原来只排干异步单、停事件线程,transport 实例活到进程退出,守规矩的单线程客户端一样泄漏一条连接。新增 BigQmtRpcClient.close()(幂等,再使用时惰性重建),BigQmtXtTrader.stop() 调用它。

服务端零改动:客户端句柄一关,服务端的连接读循环即报断开自行回收。

验证

  • 8 条新回归测试对修复前代码全红、修复后全绿;全量套件 2642 通过,collection 208 == 208。
  • 实盘 lemo 同机零依赖桥(0.3.71)只读探针:6 线程 churn 后注册表零残留,trader.stop() 后连接全关,churn 前后 interop 正常。

已知限制

  • 只随进程退出才回收连接的运行时(非 CPython 的 thread-local 回收时点不保证)由兜底清扫覆盖:下一次新建连接时释放死线程残留,非即时。
  • zmq 客户端同为按线程一把 socket 的形状,但每条泄漏的代价只是一个 FD、服务端无每连接线程,本次未改;同机零依赖传输是唯一会因此耗尽的传输。