1

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

$ 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 中的常见用例),以使用带有空 args 的“同步”句柄来追逐异步调用h[]/h(::)以获取结果,为它们制作这样的临时处理程序


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


Upd2: 如果存在延迟同步- 是否有类似延迟异步的东西?


在这里询问UpdUpd2

4

1 回答 1

3

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

案例 1: 这会在遥控器上出现故障,但事实并非如此。它正在远程评估到“.zw 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: 再次评估“值 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 通信方法。我们在发送异步消息后阻塞/监听/挂起连接,等待响应,使用称为阻塞接收的构造

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

于 2020-09-28T22:41:09.300 回答