如何用PyKX编写kdb+/q订阅程序获取quotes表数据?
解决PyKX订阅kdb+ Tick数据的问题
你的问题出在同步循环调用订阅接口,以及未处理kdb+异步推送的.u.upd消息。以下是修正方案:
问题分析
.u.sub[quotes;]是订阅初始化操作,只需要执行一次,反复调用会重复订阅,且无法获取后续推送的增量数据。- 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
相关产品推荐
相关产品推荐

