是否可以向 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 添加事件处理以在接收/发送数据时采取行动?的主要内容,如果未能解决你的问题,请参考以下文章

事件处理

将事件处理程序添加到 LightStreamer

ZeroMQ(0MQ)服务器保留客户端发送消息的状态信息的时间为多长时间?

uevent 从内核发送到用户空间 (udev)

微服务之集成下

js学习笔记:事件——事件流事件处理程序事件对象