You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PyKX编写kdb+/q订阅程序获取quotes表数据?

解决PyKX订阅kdb+ Tick数据的问题

你的问题出在同步循环调用订阅接口,以及未处理kdb+异步推送的.u.upd消息。以下是修正方案:

问题分析

  1. .u.sub[quotes;]是订阅初始化操作,只需要执行一次,反复调用会重复订阅,且无法获取后续推送的增量数据。
  2. kdb+的Tick推送通过.u.upd异步发送,PyKX默认会丢弃未处理的异步消息,因此出现Discarding unexpected async message警告。

修正后的Python订阅代码

import pykx as kx
import time

# 定义异步推送消息的处理函数
def process_updates(message):
    # 消息结构为 (`表名; 更新数据表格)
    table, data = message
    print(f"收到{table}更新:\n{data}")

# 建立连接并注册`.u.upd`消息的回调
q = kx.QConnection('localhost', 5011)
q.register('.u.upd', process_updates)

# 执行一次订阅初始化
q('.u.sub[`quotes;`]')

# 保持程序运行,等待异步推送
try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    print("订阅终止")

代码说明

  • q.register('.u.upd', process_updates):告诉PyKX将kdb+推送的.u.upd消息转发给process_updates函数处理。
  • 只调用一次.u.sub[quotes;]:完成订阅初始化,kdb+会立即发送当前quotes表的初始数据,之后每隔50ms推送一次新生成的3条数据。
  • 循环休眠是为了保持进程存活,避免程序直接退出。

验证效果

运行修正后的订阅程序后,会持续输出类似以下内容:

收到quotes更新:
time                          sym price
----------------------------------------
2023.05.12D14:32:10.123456789 A   45.67
2023.09.01D09:15:00.987654321 C   78.90
2024.01.20D16:45:30.112233445 B   23.45
...

内容的提问来源于stack exchange,提问作者marital_weeping

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:23:11