是否可以向 ZeroMQ 添加事件处理以在接收/发送数据时采取行动?
Posted
技术标签:
【中文标题】是否可以向 ZeroMQ 添加事件处理以在接收/发送数据时采取行动?【英文标题】:Is it possible to add an event handling to ZeroMQ to act when data is received/sent? 【发布时间】: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()
直到数据到达,而是我的守护进程会休眠当数据到达时,它会执行它的处理程序并再次休眠)?
如果有人能对此提供帮助/建议,那就太好了。
【问题讨论】:
【参考方案1】:没有。
在原样状态下,ZeroMQ 既不实现触发器也不实现回调。
为什么?
因为消息传递的核心思想是使用队列,而不是干扰进程的流动,除非进程本身发现询问队列是可行的(无论是使用智能方式,通过.poll()
进行测试,还是在愚蠢的方式,直接调用 .recv( ZMQ_NOBLOCK )
),如果有任何消息准备好并等待它们的后处理,然后将从 ZeroMQ 端线程开始 .recv()
他们) 及其资源并根据它们自己的进程的足迹和工作流程处理它们。
但是 POSIX SIGNAL
-s 机制改变了游戏规则:
鉴于 ZeroMQ 本身的事实,SIGUSR1
可以提供独立的(仅与使用上下文对齐)“带外 " 向接收进程发出信号,表明发送进程刚刚编组了一些要处理、发送和传递的通信,因此接收进程可能会激活并遵循来自.recv()
-ing 数据的工具和方法ZeroMQ 传递路径,尽管 ZeroMQ 机制本身并不提供回调方法。
因此,从这个意义上说,即使是算法的命令式语言实现也能感知上一次 ZeroMQ 调用的成功/失败,O/S POSIX 信令层(完全独立于分布式 ZeroMQ 消息传递) / 信号传递基础设施)可以提供这种寻求的进程间协调方法,旨在在被测进程网络的睡眠/守护进程实例之间工作。
【讨论】:
以上是关于是否可以向 ZeroMQ 添加事件处理以在接收/发送数据时采取行动?的主要内容,如果未能解决你的问题,请参考以下文章