微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

并行执行:阻止接收,延迟同步

如何解决并行执行:阻止接收,延迟同步

我问过question有关并行同步和异步调用时发生的错误。答案揭示了更大的问题:

  • 阻止接收构造会替换.z.ps / .z.pg调用吗?
  • 如果存在延迟异步(用于mserve.q),是否存在类似延迟异步的东西?

基于上一个问题的观察。该问题的情况3可以:

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

但是如果我们要确保已发送邮件怎么办:

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

似乎还可以吧?如果进一步研究documentation,我们发现还有另一种保险类型:h""-远程处理消息,在这种情况下,我们会出现错误

q)neg[h]({neg[.z.w] x};42); neg[h][]; h""; h[]
'type
<hangs>

因此,命题如下-h[](以适当的顺序发送)以某种方式改变了发送者的行为,并且可能是接收者过程,以准备进行此类通信。

解决方法

要回答您的第一个问题,我认为“替换”不是正确的术语,而是预期传入消息是由本地进程启动的,因此与消息不同,它不会路由到.z.ps处理程序该过程是意料之外的,可以在其中使用.z.ps来确保该消息不会不友好或任何情况。

发出阻止接收时,将清除O_NONBLOCK标志,然后recvfrom()阻止,直到消息到达并替换O_NONBLOCK标志为止

read(0,"h[]\n",4080)                  = 4
fcntl(4,F_GETFL)                       = 0x802 (flags O_RDWR|O_NONBLOCK)
fcntl(4,F_SETFL,O_RDONLY)             = 0
recvfrom(4,"\1\0\0\0\25\0\0\0",8,NULL,NULL) = 8
recvfrom(4,"\n\0\7\0\0\0unblock",13,NULL) = 13
fcntl(4,F_GETFL)                       = 0x2 (flags O_RDWR)
fcntl(4,O_RDONLY|O_NONBLOCK)  = 0


关于第二个问题,我认为kdb + v2.3中引入了延迟同步,用于客户端进程在等待响应时不应阻止远程进程的情况。延迟同步允许服务器处理其他客户端请求,而客户端进程将阻塞直到收到请求的信息。当客户端在收到响应之前不能做其他任何事情时,这很好。

在某些情况下,两个进程都不应该等待另一个进程-这是您所指的吗?如果是这样,则用例可能类似于分层网关系统,在该系统中,一个或多个网关相互之间发送/接收消息,但没有一个阻塞或等待。这是通过异步回调完成的。在具有多个进程的复杂系统中,每个请求在运行过程中都需要用ID进行标记,以便对其进行跟踪。同样,您将需要跟踪哪个请求来自哪个连接,以便将结果返回给正确的客户端。

这是一个更简单的示例

////////////// PROC A //////////////
q)\p
1234i
q)remoteFunc:{system"sleep 4";neg[.z.w](`clientCallback;x+y)}

////////////// PROC B //////////////
q)h:hopen 1234
q)clientCallback:{0N!x;}; .z.ts:{-1"Processing continues..";}
q)
q)neg[h](`remoteFunc;45;55);system"t 1000"
q)Processing continues..
Processing continues..
Processing continues..
Processing continues..
Processing continues..
100

// process A sent back it's result when it was ready

关于最后一个问题

  1. neg[h][]刷新异步消息,直到tcp / ip。这并不意味着遥控器已收到它们。 追踪器h""刷新h上的所有传出消息,发送自己的请求并在h上处理所有其他消息,直到收到响应。

  2. 追逐异步消息是一种确保在移至下一个异步消息之前已在远程上对其进行处理的方法。在您的示例中,紧随其后的挂起呼叫的追逐是无效的,因为它会出错,其次,这不是一项必须保证先前的异步消息在开始之前已被完全处理的任务。

Jason

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?