我正在编写一个 C++/ZMQ 脚本,它有一个订阅者从一个由单独的脚本运行的发布者那里获取数据。我无法编辑发布者代码,我需要获取 ZeroMQ 订阅者收到消息的时间。
基本上,我有:
void *zmq_subscriber_ = zmq_socket( context, ZMQ_SUB );
zmq_setsockopt( zmq_subscriber_, ZMQ_SUBSCRIBE, NULL, 0 );
while ( ( zmq_msg_recv( &msg, zmq_subscriber_, ZMQ_DONTWAIT ) ) < 0 )
{ usleep( 1000 ); }
我需要知道订阅者何时收到消息。有没有办法从 ZeroMQ 获取这些信息?提前感谢任何可以提供帮助的人!
最佳答案
Is there a way to get this information from ZeroMQ ?
幸运的是,不是直接来自 ZeroMQ API(2018/Q2)。
有什么选择吗?
假设粗略的 TimeDOMAIN 分辨率很好,只需在每次代码重新循环 while(){...; <here> }
时存储一个时间戳。代码块。这种方法有一个关于 usleep()
的盲点-duration - 延迟,其中更精确的收据时刻无法确定。
鉴于这还不够,开始使用 Poller.poll()
的非阻塞模式方法,并将任何此类延迟减少到您的意图可以处理的水平。一旦处理了一个几乎-零延迟 .poll()
在 Poller.poll()
的“内部”具有零等待时间加上避免花费任何此类 usleep()
以尽量减少盲点。
如果有极端需要,重构代码并引入新的(私有(private))API 扩展,以便从 Context()
中读取此类详细信息-实例内部状态寄存器。这将使您更接近(如果不是最接近的话)消息到达 SUB
手中的实际时刻。 边Context()
的内部处理。
关于c++ - 如何获取 ZeroMQ 时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50847380/