问题描述
当使用不同的方法(同步/异步)回调呼叫者进程时,我在不同的地方遇到错误:
$ 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]
回调的调用方上引发异常?
对于第3种情况:这是一种类似于模式(或IPC中的常见用例)的模式,用于跟踪带有空args h[]
/ h(::)
的'sync'句柄的异步调用以获取结果还为他们制作了这样的 ad-hock处理程序?
更新:
阻止接收构造会取代.z.ps/.z.pg
调用吗?
更新2: 如果存在延迟同步-是否有类似延迟异步的东西?
询问已更新和 Upd2 here。
解决方法
以下内容应有助于澄清正在发生的事情
情况1:
这使远程控制器出现故障,但事实并非如此。正在远程使用'.z.w 42'对其进行评估,然后将同步消息发送回本地进程,并由.z.pg(其默认定义为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:
再次评估“值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通信方法。发送异步消息后,我们使用称为 blocking receive
的结构来阻止/监听/挂起连接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