如何在不影响其他线程的情况下睡眠node.js中的线程?

根据理解node.js事件循环,node.js支持单个线程模型。 这意味着如果我向一个node.js服务器发出多个请求,它不会为每个请求产生一个新线程,但会逐个执行每个请求。 这意味着如果我为node.js代码中的第一个请求执行以下操作,同时在节点上发出新的请求,则第二个请求必须等到第一个请求完成时(包括5秒的休眠时间)。 对?

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

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


如果你指的是npm模块的睡眠,它会在自述中注明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();

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

   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秒钟。


请考虑deasync模块,我个人不喜欢Promise方式使所有函数异步,关键字异步/等待任何。 我认为官方的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
链接地址: http://www.djcxy.com/p/79293.html

上一篇: How to sleep the thread in node.js without affecting other threads?

下一篇: C++ Using a reference to the variable being defined