要回答您的第一个问题,我认为“替换”不是正确的术语,而是预期传入的消息是由本地进程启动的,因此它不会路由到 .z.ps 处理程序,这与进程的消息不同没想到,.z.ps 可用于确保消息不是不友好的或任何情况。
当您发出阻塞接收时,O_NONBLOCK 标志被清除并且 recvfrom() 阻塞直到消息到达并且 O_NONBLOCK 标志被替换
read(0, "h[]\n", 4080) = 4
fcntl(4, F_GETFL) = 0x802 (flags O_RDWR|O_NONBLOCK)
fcntl(4, F_SETFL, O_RDONLY) = 0
recvfrom(4,
"\1\0\0\0\25\0\0\0", 8, 0, NULL, NULL) = 8
recvfrom(4, "\n\0\7\0\0\0unblock", 13, 0, NULL, NULL) = 13
fcntl(4, F_GETFL) = 0x2 (flags O_RDWR)
fcntl(4, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
关于您的第二个问题,我相信在 kdb+ v2.3 中引入了延迟同步,用于客户端进程在等待远程进程时不应阻塞远程进程的情况。延迟同步允许服务器处理其他客户端请求,而您的客户端进程阻塞,直到收到请求的信息。当客户端在收到响应之前不能做任何其他事情时,这很好。
在某些情况下,两个进程都不应该等待另一个进程 - 这就是您所指的吗?如果是这样,那么用例可能类似于分层网关系统,其中一个或多个网关相互发送/接收消息,但没有阻塞或等待。这是通过异步回调完成的。在具有多个进程的复杂系统中,每个请求都需要在执行过程中使用 ID 进行标记,以便对其进行跟踪。同样,您需要跟踪哪个请求来自哪个连接,以便将结果返回给正确的客户端。
这是一个更简单的例子
////////////// PROC A //////////////
q)\p
1234i
q)remoteFunc:{system"sleep 4";neg[.z.w](`clientCallback;x+y)}
////////////// PROC B //////////////
q)h:hopen 1234
q)clientCallback:{0N!x;}; .z.ts:{-1"Processing continues..";}
q)
q)neg[h](`remoteFunc;45;55);system"t 1000"
q)Processing continues..
Processing continues..
Processing continues..
Processing continues..
Processing continues..
100
// process A sent back it's result when it was ready
关于你的最后一个问题
neg[h][]
至少刷新 tcp/ip 的异步消息。这并不意味着遥控器已收到它们。追逐者h""
刷新 h 上的所有传出消息,发送它自己的请求并处理 h 上的所有其他消息,直到它收到它的响应。
追逐异步消息是一种确保它们在移动到下一个异步消息之前已经在遥控器上得到处理的方法。在您的示例中,紧随其后的挂起呼叫无效,因为它会出错,其次,这不是一项需要保证在开始之前已完全处理先前的异步消息的任务。
杰森