nodejs多个计时器和cpu使用

时间:2018-06-19 04:35:31

标签: javascript node.js express socket.io

假设我有1000个并发的socket.io连接。 在断开连接时,我想给用户至少30秒重新连接并维护其会话,所以我想添加一个计时器来做到这一点。 考虑到定时器运行30秒并且只执行简单的数据库查询,这会是cpu密集型吗?这是btw的后端,所以没有浏览器。

由于

1 个答案:

答案 0 :(得分:2)

  

考虑到定时器运行30秒并且只执行简单的数据库查询,这会是cpu密集型吗?

您不希望计时器每30秒运行一次,并且在没有断开连接的套接字时运行数据库查询。这有点像" polling"这很少是最有效的做事方式。

更有意义的是每次断开连接时设置30秒计时器。将timerID放在会话对象中。如果用户重新连接,则在重新连接时,您将找到该会话并在其中找到timerID。取消该计时器。如果用户未在30秒内重新连接,则计时器将会启动,您可以清除会话。

定时器本身并不消耗CPU,所以拥有它们并不是什么大不了的事。 node.js计时器系统非常有效。它会跟踪下一个计时器何时应该触发,这是唯一一个技术上处于活动状态并为系统计时器设置的计时器。当该计时器触发时,它会为下一个应该触发的计时器设置一个系统计时器。定时器保存在一个排序的数据结构中,以便node.js。

因此,这里唯一需要消耗的CPU是用于组织新计时器的非常少量的内务处理,然后是在计时器触发时您将要运行的任何代码。无论如何你要运行该代码,只是现在或者从现在起30秒后运行它,那么当你运行它时它对你的CPU使用没有任何影响。它会以任何方式消耗相同数量的总CPU。

因此,如果你想在每个套接字断开连接时设置一个30秒的定时器,这是一个非常好的事情,它根本不会对你的CPU使用产生明显的影响。

这是一篇参考文章,有助于解释:How does Node.js manage timers internally以及其他答案:How many concurrent setTimeouts before performance issues?