在使用 0MQ 异步接收时异步发送数据的最有效方法是什么?

What's the most efficient way to async send data while async receiving with 0MQ?

本文关键字:异步 数据 有效 是什么 方法 0MQ      更新时间:2023-10-16

我已经有一个路由器/经销商设置,两端都需要能够在可用的情况下接收和发送数据。该型号几乎是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个线程回答您的问题时,这可能不是最好的方法。