Jupyter Notebook 反复运行天勤策略内存涨:close 与内核习惯

前言

很多国内期货量化的研究阶段Jupyter Notebook 里进行:改两行均线参数就 Shift+Enter 重跑,比整脚本重启方便。天勤 TqSdkTqApi 在创建时会建立与行情、交易服务的连接并维护订阅;若每个单元格都 api = TqApi(...) 而从不 api.close(),旧连接和缓冲仍占内存,表现为越跑越卡、行情乱跳、甚至连接数超限------这在期货量化教学群里非常常见,并非天勤"泄漏",而是资源未释放的使用习惯

本文说明 Notebook 场景下如何正确关闭 Api、与 wait_update 循环的关系、异步 register_update_notify 的注意点,并区分研究用 Notebook7×24 实盘进程。不默认你已区分 TqSim 与 TqKq。

一、期货研究在 Notebook 里常做什么

典型操作:拉几分钟 1 分钟或 5 分钟 K 线、看 datetime 是否推进、试一笔模拟 TargetPosTask、画均线。这些都需要 TqApi 活着。问题在于:同一内核里重复创建多个 Api,每个都在后台收国内期货行情,内存与连接叠加。

错误模式示意:

python 复制代码
# 单元格 1
api = TqApi(TqSim(), auth=TqAuth(...))
# 跑 while 或若干 wait_update

# 单元格 2 再次执行
api = TqApi(TqSim(), auth=TqAuth(...))  # 旧 api 未 close

二、正确习惯:单例 + 先关后建

python 复制代码
if "api" in globals() and api is not None:
    api.close()
api = TqApi(TqSim(), auth=TqAuth("快期账户", "密码"))

或研究一段结束后 Kernel → Restart ,再只创建一个 Api。长而久的 while True 建议放到 .py 用命令行跑,Notebook 只跑有限次 wait_update 做片段验证。

三、try/finally 保证 close

python 复制代码
api = TqApi(TqSim(), auth=TqAuth(...))
try:
    for _ in range(50):
        api.wait_update()
        # 观察 kl.iloc[-1].datetime 是否变化
finally:
    api.close()

回测单元格捕获 BacktestFinished 后同样应 close(),否则同一内核里第二次 TqBacktest 可能遇到资源未释放问题。

四、异步 notify 与 Notebook

若在协程 demo 里使用 register_update_notify,官方建议 async with api.register_update_notify() as update_chan;若手动拿 channel,用完需 await update_chan.close(),否则会泄漏。另:不要在协程里直接 wait_update(),天勤会报错;Notebook 里混同步 while 与 async task 时要只保留一套模型。

五、调试循环不要无限占着 Api

调试可加次数上限或 wait_update(deadline=...),避免单元格永远运行导致无法 close。实盘部署在国内服务器上时,用 systemd 等单进程守护,不要用合盖休眠的笔记本扛夜盘。

六、与期货实盘的关系

Notebook 适合验证"K 线 datetime 触发是否正确""一笔模拟单持仓是否变化";国内期货连续交易与风控,应放到独立 .py 进程,配置与实盘相同的 is_changing 规则,避免 Notebook 特有的一次性变量残留进生产。

总结

Jupyter 反复运行天勤策略 导致内存涨,主因是多个 TqApiclose()。期货量化研究应在单内核保持单 Api,重跑前先 close() 或重启内核;长循环用脚本;异步 notify 用 async with 或显式 close。

弄清 TqApi 是长连接资源,而不是普通变量,Notebook 体验会稳定很多。

FAQ

1)%reset 够吗?

建议先 api.close() 再 reset。

2)两个 Notebook 同账户?

每内核独立,避免同账户多端抢线。

3)内存仍涨?

检查是否缓存巨大 DataFrame;del 不再用的表。

4)能否 pickle Api?

不要;每会话重建。

风险提示

本文讨论开发环境,不构成投资建议。

相关推荐
字节跳动数据库4 分钟前
文章分享——相似函数处理方法
人工智能·后端·程序员
Bigfish_coding4 分钟前
前端转agent-【python】-12 LangChain 入门实战:RAG + LCEL 链式调用
人工智能
程序员cxuan38 分钟前
读懂 Claude Code 架构分析系列,第一篇,开始!
人工智能·后端·架构
ZhengEnCi1 小时前
P2L-Matplotlib饼图完全指南-从数据可视化到图表定制的Python绘图利器
python·matlab
曲幽1 小时前
你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南
python·fastapi·web·graphql·route·cors·rest·strawberry
饼干哥哥1 小时前
扣子3.0测评:我让 Codex 和 Claude Code 住同一个桌面,结果它们打架了!
人工智能·开源·代码规范
Token炼金师1 小时前
IP-Adapter:解耦交叉注意力如何让扩散模型看见图像
人工智能
Bigfish_coding2 小时前
前端转agent-【python】-11 LangGraph 高级特性:时间旅行与人工介入
人工智能
Token炼金师2 小时前
从safetensors到像素:ComfyUI Checkpoint加载机制的底层拆解
人工智能
AI闲人2 小时前
AI 写代码越来越快,为什么 Code Review 反而更慢了?
人工智能·code review·ai 编程