如何在不影响其他线程的情况下睡眠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?