【问题标题】:nodejs prioritise function executionnodejs优先考虑函数执行
【发布时间】:2017-11-18 00:47:55
【问题描述】:

我编辑了一个库 (ddp-client) 以使用心跳计时器,它每 X 秒发送一次 ping。但是,我也在使用蓝牙硬件做一些工作,我认为这会导致 ping 有时无法及时返回(因为蓝牙似乎暂时阻止了事件循环)。有没有办法在事件循环中优先考虑某个函数,所以它总是在其他函数之前执行?我不认为setImmediate 适合这里,因为我不知道服务器的响应消息何时到达。

定时器的实现大致如下:

every X seconds
if(ping outstanding) {
  //Did not resolve in time
  closeConnection()
} else {
  ping outstanding = true
  sendPing()
}

如果我在没有蓝牙模块的情况下运行它,它会非常好用。当我启用蓝牙模块时,有时无法解析 ping,因为扫描蓝牙所花费的时间有时比计时器的间隔长,导致断开连接,而实际上它仍然处于连接状态。

【问题讨论】:

    标签: node.js bluetooth priority-queue event-loop ddp


    【解决方案1】:

    有没有办法在事件循环中确定某个函数的优先级,让它总是在其他函数之前执行?

    没有。 node.js 没有办法让一段代码抢占另一段代码并始终拥有优先权。任何稍微“占用” CPU 或以其他方式阻塞事件循环的代码都应该修复为不这样做,或者可以将其移到它自己的子进程中,并且您可以通过许多进程间通信中的任何一个与它进行通信计划。

    或者,或者,如果 ping 计时器对于按时运行真的非常重要,那么它可能应该在它自己的子进程中,在那里它总是可以按计划运行,而不会被其他东西打断。

    像这样实现精确的计时器是 node.js 不擅长的一件事。因为它在单个线程中运行所有 Javascript,所以保持服务器即时响应或保持计时器准时运行要求没有人阻塞事件循环或占用 CPU 时间超过您的时间阈值。通常的解决方法是将事物移动到它们自己的子进程中,在那里它们获得自己的 CPU 优先级。

    【讨论】:

    • @robvandijk - 这回答了你的问题吗?如果是这样,您可以通过单击答案旁边的复选标记向社区表明这一点,并通过在 stackoverflow 上遵循正确的程序为自己赢得一些声誉积分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多