在并行执行时-哪一侧报告错误?

问题描述

当使用不同的方法(同步/异步)回调呼叫者进程时,我在不同的地方遇到错误

$ 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...