代码之家  ›  专栏  ›  技术社区  ›  tenticon

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

kdb
  •  2
  • tenticon  · 技术社区  · 6 年前

    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.ts f 在我的机器上运行需要1秒钟以上。

    当我调用函数时 f 在客户端Q会话中

    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 回复  |  直到 6 年前
        1
  •  1
  •   Rahul    6 年前

    每隔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}
    
    推荐文章