如果您使用多个线程通过套接字发送数据,建议使用 NetMQQueue 来同步这些请求。
我已将队列附加到轮询器,并且正在接收queue.ReceiveReady
事件。但在这种情况下,我可以访问底层的 ConcurrentQueue 实例。但是我不确定如何处理这个队列,我应该只取出一个项目还是应该尝试清空它?
//Should I dequeue one item
private static void Queue_ReceiveReady(object sender, NetMQQueueEventArgs<NetMQMessage> e) {
var item = e.Queue.Dequeue();
socket.SendMultipartMessage(message);
}
//or all items available
private static void Queue_ReceiveReady(object sender, NetMQQueueEventArgs<NetMQMessage> e) {
NetMQMessage message;
while (e.Queue.TryDequeue(out message, TimeSpan.FromMilliseconds(10))) {
socket.SendMultipartMessage(message);
}
}
现在到我的第二个问题。我检查了队列实现,发现它只是在底层对套接字的发送方法周围使用了一个锁。那么我为什么要使用 NetMQQueue,如果我也可以简单地在我的发送方法周围使用锁,从而减少额外对套接字的开销?
public void Send(NetMQMessage data) {
lock (lockobj) {
client.SendMultipartMessage(data);
}
}
我知道,按照文档,我应该为每个线程添加一个额外的 inproc-Router 套接字和一个 DEALER,以同步传出调用。但与自己处理同步相比,我有点害怕开销太大。我希望我的应用程序中有多达 20 个通信线程,双向异步通信。