kdb q-句柄在next.z.ts之前未刷新
q服务器每秒都会安排一些昂贵的操作kdb q-句柄在next.z.ts之前未刷新,kdb,Kdb,q服务器每秒都会安排一些昂贵的操作 .z.ts:{0N!“正在工作…”,string.z.p;{1000000?100;}每个直到1000} \t 1000 并向客户端公开一个名为f.“100000000?100}的函数f:{[n]{0N!”,直到n}。.z.ts和f在我的机器上运行的时间都超过1秒 在客户端q会话中调用函数f时 hh:`:localhost:7000::; hh(`f;3); 0N!"DONE"; 及时的预期行为是: | server executes .z.ts |
.z.ts:{0N!“正在工作…”,string.z.p;{1000000?100;}每个直到1000}
\t 1000
并向客户端公开一个名为f.“100000000?100}的函数f:{[n]{0N!”,直到n}
。.z.ts
和f
在我的机器上运行的时间都超过1秒
在客户端q会话中调用函数f
时
hh:`:localhost:7000::;
hh(`f;3);
0N!"DONE";
及时的预期行为是:
| server executes .z.ts
|
| client calls f on server
|
| server returns .z.ts
| server executes f (client request)
|
| server returns f
| server sends result of f to client on handle
| server executes .z.ts
|
到底发生了什么
| server executes .z.ts
|
| client calls f on server
|
| server returns .z.ts
| server executes f (client request)
|
| server returns f ---- same as before until here
| server executes .z.ts ---- instead of sending result of f to client!!
|
| server returns .z.ts
| server sends result of f to client
|
因此,在服务器在f
之后再次执行.z.ts
之前,我在客户端会话上看不到“DONE”
我怎样才能解决这个问题?我想明确地告诉服务器刷新句柄(即,缓冲区中的任何内容都应该在f完成后立即发送到客户端)
感谢您的帮助计时器函数在每n毫秒(n由\t设置)后被调用。如果您的函数花费的时间超过“n”毫秒,则kdb将在其他函数完成后立即调用计时器函数,并且kdb将在用户空间中将客户端数据(函数回复到客户端)排入队列 您可以使用.z.W[]查看每个句柄的挂起消息队列 解决方法之一是作为计时器函数的第一步刷新所有句柄的所有数据 一个选项是使用同步请求等待来自远程端的确认。这也将阻止您的进程,直到它从远程端得到答复
q) .z.ts:{(key .z.W[])@\:""; 0N!"Working...",string .z.P;{1000000?100;} each til 1000}
另一种选择是使用异步调用,该调用将阻塞直到数据写入套接字
q) .z.ts:{(neg@'key .z.W[])@\:(::);0N!.z.W[];0N!"Working...",string .z.P;{1000000?100;} each til 1000}
美好的我赞成第二种选择(句柄“flush”)——根据建议,要求所有句柄上都有同步响应可能会有风险,特别是当其他进程很忙或可能不是kdb客户端时。我也赞成第二种选择。我已经提到了sync,它涵盖了所有选项,也包括它是否符合任何人的项目需求。