ZeroMQ Poll函数在.NET上使用过多的CPU吗?

时间:2012-04-05 12:20:18

标签: c# zeromq

我有一个简单的控制台应用程序,它使用ZeroMQ发送和接收消息。在接收部分,我有以下消息泵代码:

   ZMQ.Context _context = new ZMQ.Context(1);

   ZMQ.PollItem[] pollItems = new ZMQ.PollItem[0];

   while (!_finished)
   {
       if (pollItems.Length > 0)
           context.Poll(pollItems, pollTimeout);
       else
           Thread.Sleep(1);

       if (_receiversChanged)
           UpdatePollItems(ref pollItems);
   }

(我的想法是我可以在运行时添加和删除轮询器中的项目,因为我需要添加接收器。每当接收器集发生更改时,UpdatePollItems只会创建一个新数组。)

我已经尝试了pollTimeout值50ms和500ms但是应用程序(它位于Console.ReadKey上的主线程上)仍然使用100%的一个核心,即使没有消息被发送。我在分析器下运行了应用程序并确认它是ZMQ.Context.Poller,它正在咀嚼所有CPU。

让其他人看到类似的行为吗?我正在使用最新的ZeroMQ C#绑定(来自NuGet的clrzmq-x64.2.2.3)。

2 个答案:

答案 0 :(得分:4)

是的,驱动程序中存在错误。我也打了那个。看一下代码,.net 4版本可能会更好,但你必须重新编译它。我将检查我重写的代码是否可以作为拉取请求重新集成。

答案 1 :(得分:4)

我猜你说当你将轮询超时设置为500毫秒时,你将变量pollTimeout设置为500.这是不正确的。对于500ms的超时,变量pollTimeout应设置为500000.如果执行context.Poll(...,500),则将其解释为500 usec,并在内部舍入为0 ms。

我在自己的系统上验证过,将500传递给poll会导致CPU利用率在90%到100%之间。将值设置为大于1000的任何值会使CPU使用率大大降低,对于500000(500ms),它应该可以忽略不计。

无论哪种方式,请将您的代码示例更新为变量pollTimeout的初始化。如果我完全偏离基础,那么至少它会阻止其他潜在的回答者走这条路。