首页 文章

如何在node.js中休眠线程而不影响其他线程?

提问于
浏览
53

根据Understanding the node.js event loop,node.js支持单个线程模型 . 这意味着如果我向node.js服务器发出多个请求,它将不会为每个请求生成一个新线程,而是逐个执行每个请求 . 这意味着如果我在node.js代码中为第一个请求执行以下操作,同时在节点上有新请求,则第二个请求必须等到第一个请求完成,包括5秒休眠时间 . 对?

var sleep = require('sleep');
    sleep.sleep(5)//sleep for 5 seconds

有没有一种方法,node.js可以为每个请求生成一个新线程,以便第二个请求不必等待第一个请求完成,或者我可以只在特定线程上调用睡眠?

3 回答

  • 107

    请考虑 deasync 模块,我个人不喜欢Promise方式使所有函数都异步,并且关键字async / await anythere . 我认为官方node.js应该考虑公开事件循环API,这将简单地解决回调地狱 . Node.js是一个框架而不是一种语言 .

    var node = require("deasync");
    node.loop = node.runLoopOnce;
    
    var done = 0;
    // async call here
    db.query("select * from ticket", (error, results, fields)=>{
        done = 1;
    });
    
    while (!done)
        node.loop();
    
    // Now, here you go
    
  • 0

    如果您指的是npm模块sleep,它在自述文件中指出 sleep 将阻止执行 . 所以你是对的 - 这不是你想要的 . 相反,你想使用非阻塞的setTimeout . 这是一个例子:

    setTimeout(function() {
      console.log('hello world!');
    }, 5000);
    

    对于任何希望使用es7 async / await执行此操作的人,此示例应该有所帮助:

    const snooze = ms => new Promise(resolve => setTimeout(resolve, ms));
    
    const example = async () => {
      console.log('About to snooze without halting the event loop...');
      await snooze(1000);
      console.log('done!');
    };
    
    example();
    
  • 2

    如果您在每个请求中都有一个异步请求的循环,并且您希望在每个请求之间有一定的时间,则可以使用以下代码:

    var startTimeout = function(timeout, i){
            setTimeout(function() {
                myAsyncFunc(i).then(function(data){
                    console.log(data);
                })
            }, timeout);
       }
    
       var myFunc = function(){
            timeout = 0;
            i = 0;
            while(i < 10){
                // By calling a function, the i-value is going to be 1.. 10 and not always 10
                startTimeout(timeout, i);
                // Increase timeout by 1 sec after each call
                timeout += 1000;
                i++;
            }
        }
    

    在发送下一个请求之前,此示例在每个请求之后等待1秒 .

相关问题