【问题标题】:understanding the node.js event queue and process.nextTick了解 node.js 事件队列和 process.nextTick
【发布时间】:2013-04-19 16:47:09
【问题描述】:

我无法准确理解 process.nextTick 的工作方式。我以为我理解了,但我似乎无法复制我认为这应该如何工作:

var handler = function(req, res) {
    res.writeHead(200, {'Content-type' : 'text/html'});
    foo(function() {
        console.log("bar");
    });
    console.log("received");
    res.end("Hello, world!");
}

function foo(callback) {
    var i = 0;
    while(i<1000000000) i++;
    process.nextTick(callback);
}

require('http').createServer(handler).listen(3000);

foo 循环时,我将发送多个请求,假设handler 将在foo 后面多次排队,而callback 仅在foo 完成时才排队。

如果我对它的工作原理是正确的,我假设结果将如下所示:

received
received
received
received
bar
bar
bar
bar

但它没有,它只是顺序的:

received
bar
received
bar
received
bar
received
bar

我看到foo 在执行callback 之前返回,这是预期的,但似乎callback 是NEXT,而不是在队列的末尾,在所有进来的请求之后。是它是这样工作的吗?也许我只是不明白节点中的事件队列是如何工作的。请不要指向我here。谢谢。

【问题讨论】:

    标签: javascript node.js callback eventqueue


    【解决方案1】:

    process.nextTick 将回调放在将要执行的下一个刻度上,而不是放在刻度队列的末尾。

    Node.js 文档 (http://nodejs.org/api/process.html#process_process_nexttick_callback) 说: “它通常在任何其他 I/O 事件触发之前运行,但也有一些例外。”

    setTimeout(callback, 0) 可能更像你描述的那样工作。

    【讨论】:

    • 不,setTimeout 的行为方式相同。我想我真的在问我应该如何在前一个请求完成之前开始处理 http 请求。
    • 实际上,我意识到setTimeout 完全符合我的要求,因此我深表歉意。但是,如果 process.nextTick 不允许 CPU 密集型任务和 http 处理的交错,究竟是什么?
    • “不在滴答声的末尾”——那么,有没有办法在事件队列的末尾推送任意函数? setTimeout(fn, 0) 是推荐的方式还是只是一种解决方法?
    【解决方案2】:

    你当然应该阅读 fgascon 提供的链接,也许

    https://github.com/joyent/node/issues/3335 了解更多背景信息。

    当您想在任何 IO 之前调用一些代码,但在调用上下文返回之后(通常是因为您想在事件发射器上注册侦听器并且需要在注册任何内容之前返回创建的发射器),使用 process.nextTick )。

    【讨论】:

      猜你喜欢
      • 2015-08-04
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多