3

我有一个简单的控制台应用程序,它使用 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 只需在接收器集更改时创建一个新数组。)

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

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

4

2 回答 2

4

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

于 2012-04-06T09:00:29.850 回答
4

我猜测当您说将轮询超时设置为 500 毫秒时,您将变量 pollTimeout 设置为 500。这是不正确的。对于 500 毫秒的超时,变量 pollTimeout 应设置为 500000。如果您执行 context.Poll(...,500),它将被解释为 500 微秒,并且在内部四舍五入为 0 毫秒。

我在自己的系统上验证,通过 500 进行轮询将导致 CPU 利用率在 90% 到 100% 之间。将该值设置为超过 1000 会使 CPU 使用率大大降低,对于 500000(500 毫秒),它应该可以忽略不计。

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

于 2012-09-10T23:37:04.160 回答