如何在不影响其他线程的情况下睡眠node.js中的线程?
根据理解node.js事件循环 ,node.js支持单个线程模型。 这意味着如果我向一个node.js服务器发出多个请求,它不会为每个请求产生一个新的线程,而是会逐个执行每个请求。 这意味着如果我为node.js代码中的第一个请求执行以下操作,同时在节点上发出新的请求,则第二个请求必须等到第一个请求完成(包括5秒的hibernate时间)。 对?
var sleep = require('sleep'); sleep.sleep(5)//sleep for 5 seconds
有没有一种方法,node.js可以为每个请求产生一个新的线程,以便第二个请求不必等待第一个请求完成,或者我可以只调用特定线程上的睡眠?
如果你指的是npm模块的睡眠状态 ,它会在自述文件中注明sleep
将阻止执行。 所以你是对的 – 这不是你想要的。 相反,你要使用非阻塞的setTimeout 。 这里是一个例子:
setTimeout(function() { console.log('hello world!'); }, 5000);
对于任何想使用es7asynchronous/等待来做这个的人来说,这个例子应该有所帮助:
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();
如果你在每一个循环中都有一个asynchronous请求,并且你希望在每个请求之间有一定的时间,你可以使用下面的代码:
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秒钟。