【问题标题】:Zero-Copy messaging with zmqpp使用 zmqpp 进行零拷贝消息传递
【发布时间】:2019-08-22 07:26:41
【问题描述】:

ZeroCopy messaging 是可以在 zeromq 中实现的,但是是否可以将它与 zmqpp c++​​ 绑定一起使用?几乎没有文档,我在示例中找不到任何东西......

【问题讨论】:

  • 您使用的是哪个 C++ 绑定? cppzmq?一般来说,C++ 应该引入一些限制(如果有的话),而您可以在使用 ZMQ 的直接 C 中实现的限制。在 C 中实现零拷贝的关键似乎是 zmq_msg_init_data 方法,它似乎松散地包装在我看过的 C++ 绑定中,所以看起来你应该通过探索这条途径找到成功。
  • 我刚刚看到你专门提到了zmqpp绑定,让我看看我能看到什么......
  • 好的,我将把它保存在 cmets 中,因为我对你的问题没有最终答案,但你选择的绑定到 zmq_msg_init_data 的唯一参考是 frame.cpp -但是快速浏览代码库并没有显示任何使用该签名初始化框架的内容,因此看起来您将不得不手动构建消息框架来完成您所追求的事情,但这应该是可能的.
  • 不是答案,但如果您对项目不太了解,我会切换到 cppzmq。这是一个更活跃的项目,由一些核心 libzmq 人员维护。仅它的标题并且支持零拷贝。 github.com/zeromq/cppzmq
  • @JamesHarvey,是的,谢谢,我不太喜欢 zmqpp。文档很少,好像维护得不好……我不明白为什么github上的zeromq项目页面中有两个不同的c++绑定……

标签: zeromq


【解决方案1】:

只需简单地使用 zmqpp::message::copy()。

在zmqppsource code我们可以看到:

void message::copy(message const& source)
{
    _parts.resize( source._parts.size() );
    for(size_t i = 0; i < source._parts.size(); ++i)
    {
        _parts[i] = source._parts[i].copy();
    }

    // we don't need a copy of the releasers as we did data copies of the internal data,
    //_releasers = source._releasers;
    //_strings = source._strings
}

定义为的_parts:

private:
    typedef std::vector<frame> parts_type;
    parts_type _parts;

所以,source._parts[i].copy() 实际上调用了定义here:的zmqpp::frame::copy():

frame frame::copy() const
{
    frame other( size() );
    other._sent = _sent;

    if( 0 != zmq_msg_copy( &other._msg, const_cast<zmq_msg_t*>(&_msg) ) )
    {
        throw zmq_internal_exception();
    }

    return other;
}

代码sn-p中的zmqpp::frame::_msg定义为zmq_msg_t。源 zmqpp::message 对象的框架对象中的所有 zmq_msg_t 对象被 zmq_msg_copy 零复制到新的 zmqpp::message 对象。

所以,zmqpp::message::copy() 帮助我们获得一个新的 zmqpp::message 对象,它的所有帧都是从源 zmqpp::message 对象复制的零。

【讨论】:

    【解决方案2】:

    我会切换到cppzmq。

    这是一个更活跃的项目,由一些核心 libzmq 人员维护。

    它只是标题并且支持零拷贝。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-26
      • 2012-02-20
      • 2022-12-09
      • 2014-10-25
      • 2020-01-23
      • 1970-01-01
      • 2013-06-25
      • 2017-07-06
      相关资源
      最近更新 更多