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).
我有一个小应用程序可以使用来自 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).