0

我问了一个关于并行同步和异步调用时发生的错误的问题。答案揭示了一个更大的问题:

  • 阻塞接收构造会替换.z.ps /.z.pg 调用吗?
  • 如果存在延迟同步(在 中使用mserve.q),是否存在类似延迟异步的东西?

我的观察基于上一个问题。该问题的案例3是可以的:

q)neg[h]({neg[.z.w] x};42); h[]
42

但是,如果我们想确保我们的消息已发送怎么办:

q)neg[h]({neg[.z.w] x};42); neg[h][]; h[]
42

看起来不错,对吧?如果我们进一步查看文档,我们会发现我们还有另一种类型的保险:h""- 远程处理的消息,在这种情况下,我们遇到了错误:

q)neg[h]({neg[.z.w] x};42); neg[h][]; h""; h[]
'type
<hangs>

因此,命题如下 - h[](以适当的顺序发送)以某种方式改变了发送者的行为,并且可能是一个接收者进程,为此类通信做好准备。

4

1 回答 1

1

要回答您的第一个问题,我认为“替换”不是正确的术语,而是预期传入的消息是由本地进程启动的,因此它不会路由到 .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

关于你的最后一个问题

  1. neg[h][]至少刷新 tcp/ip 的异步消息。这并不意味着遥控器已收到它们。追逐者h""刷新 h 上的所有传出消息,发送它自己的请求并处理 h 上的所有其他消息,直到它收到它的响应。

  2. 追逐异步消息是一种确保它们在移动到下一个异步消息之前已经在遥控器上得到处理的方法。在您的示例中,紧随其后的挂起呼叫无效,因为它会出错,其次,这不是一项需要保证在开始之前已完全处理先前的异步消息的任务。

杰森

于 2020-09-30T03:27:27.103 回答