关于并行执行——哪一方报告错误?

On parallel execution - which side reports about an error?

当使用不同的方法 (sync/async) 回调调用进程时,我在不同的方面收到错误:

$ q -p 1234  │$ q
             │q)h:hopen`::1234;
             │q)neg[h]({.z.w x};42)
q)'type      │
             │q)neg[h]({neg[.z.w] x};42)
             │q)'type
             │
             │q)neg[h]({neg[.z.w] x};42); h[]
             │42

你能解释一下第一种和第二种情况下的这种行为吗?为什么在使用同步回调命令 .z.w x 的第二个进程上引发异常,而在使用 neg[.z.w] 回调的调用者上引发异常?

对于第三种情况:这是否类似于一种模式(或 IPC 中的常见用例)以使用 'sync' 句柄和空参数 h[]/h(::) 来追逐异步调用为他们制作这样的 ad-hock 处理程序 以获得结果?


更新: 阻塞接收 构造是否替换 .z.ps/.z.pg 调用?


Upd2: 如果存在 deferred synchronous - 是否存在类似 deferred asynchronous?


询问 UpdUpd2 .

以下应该有助于澄清正在发生的事情

案例 1: 这给出了远程失败的外观,但事实并非如此。它在远程上被评估为'.z.w 42',它将同步消息发送回本地进程,在那里它由.z.pg(其默认定义为value)评估。 'value 42' 导致返回到远程的类型错误。

q)h:hopen 1234
q).z.pg:{value x};system"e 1"
q)neg[h]({.z.w x};42)
q)'type
  [0]  .z.pg:{value x}
              ^
q))

案例 2: 再次评估 'value 42'(这次由 .z.ps - 其默认定义也是 value)因类型错误而失败,但由于它是异步的,因此不会返回到发送进程

q).z.ps:{value x}
q)
q)neg[h]({neg[.z.w] x};42)
q)'type
  [0]  .z.ps:{value x}
              ^
q))

案例 3: 这是一种称为 延迟同步 的 IPC 通信方法。在发送异步消息后,我们 block/listen/hang 在连接上等待响应,使用一种称为 阻塞接收

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

在某些情况下,可能没有必要挂起连接,即如果回调调用另一个函数,就像这样

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

q)add:(0N!10+);neg[h]({neg[.z.w](`add;x)};42);
q)52

此处 mserve.q 使用延迟同步消息 - https://github.com/KxSystems/kdb/blob/master/e/mserve.q