Repository navigation
v0.3.72
修复
- 按线程建的传输连接随线程退出释放(#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、服务端无每连接线程,本次未改;同机零依赖传输是唯一会因此耗尽的传输。