while(1) 和阻塞调用之间的性能

Performance between while(1) and blocking call

我有一个小应用程序可以使用来自 RabbitMQ 的消息。

目前它在 while(1) 循环中,它调用 "Dequeue" 并永远在那里等待消息,然后处理消息。

所以我在想阻塞调用 "Dequeue" 是一个好主意还是立即 DequeueNoWait(那里什么都没有 return 立即)不是更好,甚至 "Dequeue" 与暂停。当然会有更多的 while 迭代。

感谢

这是一道经典题。您可以做的最好的事情是使用带超时的阻塞 Dequeue(),这样不仅可以处理 RabbitMQ 消息。例如:

  • on Unix/Linux 还处理系统信号,例如 SIGHUP 或 SIGINT
  • 终端命令也接受用户输入以使用消息 "Press ESC to quit..." 或类似内容
  • 来跳出循环
  • 如果有其他输入流也在同一线程中处理这些输入流

应根据您的预期设置超时。对于某些系统信号,在进程被冲出水面之前会给出非常严格的超时。对于控制台应用程序,人类用户不会注意到 150 毫秒的超时,对他们来说,它仍然看起来接近实时。

如果您不阻止也不使用超时,CPU 将消耗不必要的资源以尽可能快地循环,没有任何好处。只有在时机极其重要的情况下,这样的事情才可取。但是你也不会使用 RabbitMQ。


编辑:关于超时的更多信息

A 1 second timeout does not mean that a message is picked up in 1 second. Messages are still processed instantly, as they arrive. The timeout means that OTHER tasks are performed with at most 1 second delay (mean delay is half the timeout, so 0.5 seconds).