【发布时间】:2019-08-06 09:16:07
【问题描述】:
我有一个 ROUTER/DEALER 设置,只要数据可用,两端就需要能够异步接收和发送数据。该模型几乎是 0MQ 的异步 C++ 服务器:http://zguide.zeromq.org/cpp:asyncsrv
客户端和服务器工作人员都会轮询,当有可用数据时,他们会调用回调。发生这种情况时,从另一个线程(!)我将数据放入std::deque。在每个 poll-forever 线程中,我检查deque(处于锁定状态),如果那里有项目,我将它们发送到指定的 DEALER id(id 放在队列中)。
但我不禁认为这不是惯用的 0MQ。互斥锁可能是一个设计问题。此外,如果轮询之间经过足够的时间(并且数据在deque 中累积),内存消耗可能会变得相当高。
我能想到的唯一选择是每次我想发送数据时让另一个 DEALER 线程连接到inproc,然后让它发送并退出。但是,这意味着每个发送的数据项都要连接 + 套接字的构造和销毁,这可能并不理想。
有没有惯用的 0MQ 方法来做到这一点,如果有,它是什么?
【问题讨论】:
-
在给定 nCPU 核心 [1] 和此类进程可分配 RAM [GB] 的情况下,您的目标延迟 [us] 和数据有效负载大小 [B] + 峰值吞吐量节奏 [Hz] 是多少?
-
我还没有确切的要求,我只是对我当前的设计是否干净与 0MQ 设计理念(如果我正在阅读,这似乎完全不鼓励锁定)感兴趣正确)。