【问题标题】:Is it possible to add an event handling to ZeroMQ to act when data is received/sent?是否可以向 ZeroMQ 添加事件处理以在接收/发送数据时采取行动?
【发布时间】:2017-06-12 18:06:14
【问题描述】:

我在 Linux Ubuntu 中用 C 语言创建了两个不相关的守护进程。这些进程处于休眠模式,只有在接收到数据时才会唤醒,并执行信号处理程序中实现的动作并再次休眠。

我已经使用 SIGNAL IPC 和消息队列实现了这种通信。在发送消息之前,我先发送信号SIGUSR1,然后发送数据,并为SIGUSR1编写信号处理程序以执行所需的操作。

我想使用 ZeroMQ 实现相同的通信方式,我一直在阅读他们的 指南 以了解 ZeroMQ 是否有任何类型的事件处理或通知方法用于其他进程,当数据已到达(用于 C 语言)。

我也参考了以下链接:

Does ZeroMQ have a notification/callback event/message for when data arrives?

但我还是很怀疑。

ZeroMQ 是否通知或触发其他进程一些事件,当新数据已发送时(我不想等待或 poll() 直到数据到达,而是我的守护进程会休眠当数据到达时,它会执行它的处理程序并再次休眠)?

如果有人能对此提供帮助/建议,那就太好了。

【问题讨论】:

    标签: callback event-handling multiprocessing zeromq daemon


    【解决方案1】:

    没有。

    在原样状态下,ZeroMQ 既不实现触发器也不实现回调。

    为什么?

    因为消息传递的核心思想是使用队列,而不是干扰进程的流动,除非进程本身发现询问队列是可行的(无论是使用智能方式,通过.poll() 进行测试,还是在愚蠢的方式,直接调用 .recv( ZMQ_NOBLOCK ) ),如果有任何消息准备好并等待它们的后处理,然后将从 ZeroMQ 端线程开始 .recv() 他们) 及其资源并根据它们自己的进程的足迹和工作流程处理它们。


    但是 POSIX SIGNAL-s 机制改变了游戏规则:

    鉴于 ZeroMQ 本身的事实,SIGUSR1 可以提供独立的(仅与使用上下文对齐)“带外 " 向接收进程发出信号,表明发送进程刚刚编组了一些要处理、发送和传递的通信,因此接收进程可能会激活并遵循来自.recv()-ing 数据的工具和方法ZeroMQ 传递路径,尽管 ZeroMQ 机制本身并不提供回调方法。

    因此,从这个意义上说,即使是算法的命令式语言实现也​​能感知上一次 ZeroMQ 调用的成功/失败,O/S POSIX 信令层(完全独立于分布式 ZeroMQ 消息传递) / 信号传递基础设施)可以提供这种寻求的进程间协调方法,旨在在被测进程网络的睡眠/守护进程实例之间工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      相关资源
      最近更新 更多