kdb q - 句柄在下一个之前没有刷新。z.ts
kdb q - handle is not flushed before next .z.ts
A 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 秒的时间。
当我在客户端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 将在用户 space.[=12 中排队客户端数据(函数回复客户端) =]
您可以使用 .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}
A 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 秒的时间。
当我在客户端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 将在用户 space.[=12 中排队客户端数据(函数回复客户端) =]
您可以使用 .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}