在使用 0MQ 异步接收时异步发送数据的最有效方法是什么?
What's the most efficient way to async send data while async receiving with 0MQ?
我已经有一个路由器/经销商设置,两端都需要能够在可用的情况下接收和发送数据。该型号几乎是0MQ的ASYNC C 服务器:http://zguide.zeromq.org/cpp:asasyncsrv
客户端和服务器工人都进行了调查,当有数据可用时,他们将调用回调。在发生这种情况的同时,从另一个线程(!(我将数据放在std::deque
中。在每个民意调查中,我检查deque
(在锁定下(,如果有项目,我将其发送到指定的经销商ID(ID放置在队列中(。
,但我不禁认为这不是惯用的0MQ。静音可能是一个设计问题。另外,如果足够的时间在民意调查之间传递(并且数据累积在deque
中(。
我唯一能想到的是让另一个经销商线程每次发送数据时都连接到inproc
,然后将其发送并退出。但是,这意味着每项发送的数据连接 插座的构造和破坏,这可能不是理想的。
是否有一种惯用的0mq做到这一点,如果是的话,这是什么?
我不完全理解您的设计,但我确实了解您对使用锁的担忧。
在大多数情况下,您可以重新设计代码以使用Zeromq Pairocet和Inproc删除锁的使用。
您真的需要std :: Deque吗?如果没有
如果您真的需要Deque,然后将其封装在其自己的线程中(一类很不错(,并通过Inproc套接字访问其API(推送等(。
所以就像我在错误的轨道上说的那样,但是在99%的情况下,我遇到的情况下,您总是可以用一些ZMQ_PAIR/INPROC完全删除锁。
0MQ队列的缓冲区大小有限,并且可以控制。因此,内存问题将到达一定程度,然后删除数据。因此,您可以考虑使用Contyate选项,仅将最新数据留在队列中。
在单个机器中的单个服务器和通信的情况下,我建议使用publish/subpribe模型使用Contrate选项,一旦阅读缓冲区,您就会收到新数据,而不必担心内存。它消除了阻塞队列问题。
至于您的实施情况,您非常正确,这不是最好的设计,但它是不可避免的。我建议检查问题访问std :: Deque从3个线程回答您的问题时,这可能不是最好的方法。
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 如何使用软化工具包从 OPC UA 服务器异步读取操作回调中的数据值响应中获取 NodeId 详细信息
- 在使用 0MQ 异步接收时异步发送数据的最有效方法是什么?
- 异步发送和接收带有提升的自定义数据包?
- 从streambuffer中提升异步读写异常数据
- Boost ASIO:异步数据读数
- 如何在Qt中异步加载大文件中的数据
- 从多个文件描述符异步接收UDP数据包
- 提升ASIO.当我的程序继续发送数据时,异步接收不起作用
- 异步服务器在没有明显原因的情况下停止从客户机获取数据
- 在调用前一个处理程序的完成处理程序之前异步发送数据是否有效
- Win32异步客户端传入数据处理
- Boost 的 UDP 异步客户端接收自己的数据报
- C++ 提升 ASIO |同步写入到异步读取 |无法在第二次读取中接收正确的数据
- C++ Ubuntu select() 如果串行接口有异步读取的数据