关于并行执行——哪一方报告错误?
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?
询问 Upd 和 Upd2 .
以下应该有助于澄清正在发生的事情
案例 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
当使用不同的方法 (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?
询问 Upd 和 Upd2
以下应该有助于澄清正在发生的事情
案例 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