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

本文关键字:调用 之间 性能 while | 更新日期: 2023-09-27 18:03:00

我有一个小应用程序,它从RabbitMQ中获取消息。

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

所以我在想阻塞调用"Dequeue"是一个好主意,还是立即DequeueNoWait(没有返回立即)不是更好,甚至可能是一个超时的"Dequeue"。当然会有更多的while迭代。

谢谢

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

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

  • 在Unix/Linux上也处理系统信号,如SIGHUP或SIGINT
  • 上的终端命令也接受用户输入,以跳出循环,提示"Press ESC to quit…"或类似的信息
  • 如果有其他的输入流处理这些,也在同一个线程

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

如果你不阻塞,不使用超时,CPU将消耗不必要的资源,只是尽可能快地循环,没有任何好处。只有在时机非常重要的情况下,这样做才是明智的。但是你也不会使用RabbitMQ。


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

1秒超时表示消息在1秒内被拾取。消息到达时仍然是即时处理的。超时意味着其他任务执行时最多延迟1秒(平均延迟是超时的一半,即0.5秒)。