在下一个.z.ts之前不刷新kdb q句柄

时间:2019-01-30 09:18:48

标签: kdb

q服务器每秒安排一些昂贵的操作

.z.ts:{0N!"Working...",string .z.P;{1000000?100;} each til 1000}
\t 1000

并将功能f:{[n]{0N!"Called f...";100000000?100} each til n}公开给客户端。 .z.tsf都需要超过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  
|

因此,在.z.ts之后服务器再次执行f之前,我在客户端会话上看不到“完成”。

我该如何解决?我想告诉服务器显式刷新该句柄(即f完成后应立即将缓冲区上的所有内容发送给客户端)

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

每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}