c# - NetMQ 中 RouterSocket 上的轮询器

标签 c# .net zeromq netmq

我在客户端有一个 RequestSocket 向服务器发送请求。服务器必须能够并行处理请求,因此我使用了带有轮询器的 RouterSocket。

我不确定这是否是最好的实现,因为它使用了大量的 CPU 而没有要处理的请求?特别是 RouterSocket 上的 SendReady 事件被触发得非常频繁。

class Program
{
    static ConcurrentQueue<NetMQMessage> outgoingQueue = new ConcurrentQueue<NetMQMessage>();

    static void Main(string[] args)
    {
        var poller = new Poller();
        using (var context = NetMQContext.Create())
        using (var router = context.CreateRouterSocket())
        {
            router.Bind("tcp://127.0.0.1:1337");
            poller.AddSocket(router);

            router.ReceiveReady += (s, a) => HandleRequest(a.Socket.ReceiveMessage());

            router.SendReady += (s, a) =>
            {

                if (!outgoingQueue.IsEmpty)
                {
                    NetMQMessage msg;
                    if (outgoingQueue.TryDequeue(out msg))
                    {
                        a.Socket.SendMessage(msg);
                        Console.WriteLine("Sent: " + msg[2].ConvertToString());
                    }
                }
            };
            poller.Start();
        }
    }

    static void HandleRequest(NetMQMessage requestMsg)
    {
        Console.WriteLine("Received: " + requestMsg[2].ConvertToString());
        Task.Factory.StartNew(() =>
        {
            Thread.Sleep(1000);
            NetMQMessage responseMsg = new NetMQMessage();
            responseMsg.Append(requestMsg[0]);
            responseMsg.AppendEmptyFrame();
            responseMsg.Append("Enjoy " + requestMsg[2].ConvertToString());
            outgoingQueue.Enqueue(responseMsg);
        });
    }
}

最佳答案

你不应该使用 SendReady,它会每次调用因为路由器总是准备好发送。按照建议尝试阅读投票指南。另请阅读 NetMQScheduler,您可以使用它代替 ConcurrentQueue。

http://somdoron.com/2013/06/netmq-scheduler/

关于c# - NetMQ 中 RouterSocket 上的轮询器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31807977/

相关文章:

c# - NAudio 拆分 mp3 文件

c# - 在 POCO 上实现 INotifyPropertyChanged

c# - 对 Dictionary<int, double> 类型的 Linq 查询

.net - "An attempt was made to load a program with an incorrect format"即使平台相同

python - 如何在 zmq 的推/拉模式中设置 hwm?

c# - 在 Visual Studio 2008 项目中存储版本号的最佳方式是什么?

javascript - 更改下拉列表中项目的文本

c# - 我可以检测到垃圾收集在 .NET 中运行的时刻吗?

python - Threading Condition Acquire lock 并不是真正获取锁

Python Zeromq "Hello World"在recv()上阻塞