c++ - 是否可以在通过 UDP 发送数据时将数据流式传输到 ZeroMQ 消息中?

标签 c++ zeromq iostream low-latency

我们正在处理 30fps 的延迟关键型应用程序,管道中有多个阶段(例如压缩、网络发送、图像处理、3D 计算、纹理分享等)。

通常我们可以像这样实现这些多个阶段:

[Process 1][Process 2][Process 3]

---------------time------------->

但是,如果我们可以堆叠这些进程,那么 [Process 1] 可能正在处理数据,它不断地将其结果传递给 [Process 2]。这类似于 iostream 在 c++ 中的工作方式,即“流”。使用线程,这可以减少延迟:

[Process 1]
    [Process 2]
        [Process 3]
<------time------->

假设 [Process 2] 是我们的 UDP 通信(即 [Process 1] 在计算机 A 上, [进程 3] 在计算机 B 上)。

[Process 1] 的输出大约为 3 MB(即通常 > 300 个 9 KB 的巨型数据包),因此我们可以假设当我们调用 ZeroMQ 时:

socket->send(message); // message size is 3 MB

然后在库或操作系统的某个地方,数据被拆分成数据包,这些数据包按顺序发送。此函数假定消息已经完全形成。

当通过 UDP 发送大数据时,是否有一种方法(例如 API)可以让部分消息“正在构建”或“按需构建”?这在接收方是否也可能(即允许在消息的开头采取行动,因为消息的其余部分仍在传入)。或者.. 是我们自己手动将数据拆分成更小块的唯一方法吗?

注意:
网络连接是计算机 A 和 B 之间的直线 GigE 连接。

最佳答案

不,你不能现实地做到这一点。 API 不提供它,ZeroMQ promise 接收者将收到完整的消息(包括多部分消息)或根本没有消息,这意味着它不会将消息呈现给接收者,直到它完全传输.在这里,将数据自己拆分为单独的可操作 block ,作为单独的 ZeroMQ 消息发送是正确的做法。

关于c++ - 是否可以在通过 UDP 发送数据时将数据流式传输到 ZeroMQ 消息中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35285836/

相关文章:

c++ - C 中的高斯雅可比方法

python - 如何设置高水位线以阻止 pyzmq 中被淹没的收件人?

C++ ostream 重载不起作用

c++ - 命名空间定义和异常(exception)

c++ - 'std::cout' 声明中的明确资格

c++ - 由于 cout,GCC 4.8.2 自动矢量化失败

c++ - 具有 3 个类别的 OpenCV SVM 预测置信度

c++ - OpenGL 子窗口不会同时响应

c++ - 如何在 Mac OS X 上为 ZeroMQ 安装 C++ 绑定(bind)?

python - ZMQ软件和语言绑定(bind)的区别