kdb q-句柄在next.z.ts之前未刷新

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 |

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
|   
| 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,它涵盖了所有选项,也包括它是否符合任何人的项目需求。