我编辑了一个库(ddp-client)以使用心跳计时器,该计时器每隔X秒发送一次ping。但是,我也在做蓝牙硬件的一些工作,我认为这有时候不会及时返回ping(因为蓝牙似乎暂时阻止了事件循环)。有没有办法在事件循环中确定某个函数的优先级,所以它总是先于其他函数执行?我不认为setImmediate
在这里是合适的,因为我不确切知道来自服务器的响应消息何时到达。
计时器的实现大致如下:
every X seconds
if(ping outstanding) {
//Did not resolve in time
closeConnection()
} else {
ping outstanding = true
sendPing()
}
如果我在没有蓝牙模块的情况下运行它,这完全正常。当我启用蓝牙模块时,ping有时无法解决,因为扫描蓝牙所需的时间有时长于计时器的间隔,导致断开,而它实际上仍然连接。
答案 0 :(得分:0)
有没有办法在事件循环中优先处理某个函数,所以它总会在其他函数之前执行?
没有。 node.js没有办法让一段代码先占用另一段代码并始终具有优先级。任何" hogs" CPU有点或以其他方式阻塞事件循环应该被修复为不这样做,或者它可以移动到它自己的子进程中,你可以通过许多进程间通信方案中的任何一个与它通信。
或者,或者,如果ping计时器确实非常重要,按时运行,那么也许它应该在它自己的子进程中,它始终可以按计划运行,而不会有其他事情中断它。
像这样实现精确的计时器是node.js不擅长的一件事。因为它在一个线程中运行所有Javascript,保持服务器立即响应或保持定时器准时运行,这要求没有人阻止事件循环或占用CPU超过时间阈值。通常的解决方法是将事物移动到他们自己的子进程中,在那里他们通过CPU获得自己的优先级。