【问题标题】:Where is the NodeJS idle loop?NodeJS 空闲循环在哪里?
【发布时间】:2014-01-06 07:48:54
【问题描述】:

使用 ExpressJS 和 Socket.IO 我有一个 HTML 场景,多个用户可以连接到 NodeJS。我即将制作一些必须同步到所有客户端的动画。

在客户端,我知道动画可以通过 setInterval()(不是时间理想)然后 socket.emit() 到 NodeJS 来实现。但是 NodeJS 中是否有一个空闲循环可以用于主控动画和 io.sockets.emit() 来更新每个人的信息?

编辑:我想对 node.js 中的值进行一般“动画”,例如伪代码:

process.idle(function() {

     // ...
     itempos.x += (itempos.dest - itempos.x) / 20; // easing
     itempos.y += (itempos.dest - itempos.y) / 20; // easing

     io.sockets.broadcast('update', itempos);
     // ...
});

【问题讨论】:

标签: node.js socket.io


【解决方案1】:

作为服务器端框架,它很少会空闲(CPU 或 I/O)。此外,idleloop 更适合 DOM 需求。但是在 node.js 中你有以下功能:

  1. process.nextTick :在当前事件队列完成后执行回调,即在下一个事件循环开始时。在执行 maxTickDepth nextTick 调用之前,它不允许执行 I/O。如果使用过多,可能会阻止 I/O 发生。

  2. setImmediate :在当前事件循环中的 I/O 回调完成后执行回调。允许 I/O 在多个 setImmediate 调用之间发生。

根据您的需要,setImmediate 更适合您的需求。

【讨论】:

    【解决方案2】:

    查看计时器文档:http://nodejs.org/api/timers.html

    所有的定时器函数都是全局的。

    setInterval(callback, delay, [arg], [...])

    安排每延迟毫秒重复执行回调。返回一个可能与 clearInterval() 一起使用的 intervalId。您也可以选择将参数传递给回调。

    对于同步的客户端动画,与尝试将尽可能多的 websocket 发射压缩到动画持续时间相比,以较慢的速度按块执行序列可能更有意义。根据我的经验,人眼比 websocket 慢得多。

    有大量的客户端框架可以为你做缓动,而不是服务器问题。

    (当然,所有这些都忽略了您的用例!)

    【讨论】:

    • 感谢您的回复。我现在只是在探索 NodeJS,所以我不想做任何特别的事情。缓动示例是刚刚编造的。从目前的 cmets 来看,似乎没有传统的空闲循环呢?
    • 据我所知,空闲循环用于后台任务。对于事件驱动的架构,基本上一切都在后台运行,可以这么说。不基于真实用例的问题总是很难回答:)
    猜你喜欢
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2014-10-10
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    相关资源
    最近更新 更多