我有一个简单的控制台应用程序,它使用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)。
答案 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的初始化。如果我完全偏离基础,那么至少它会阻止其他潜在的回答者走这条路。