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

emi*_*lly 62 multithreading asynchronous node.js

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

var sleep = require('sleep');
    sleep.sleep(5)//sleep for 5 seconds
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*don 129

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

setTimeout(function() {
  console.log('hello world!');
}, 5000);
Run Code Online (Sandbox Code Playgroud)

对于任何希望使用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();
Run Code Online (Sandbox Code Playgroud)

  • 是的,它使用单个执行线程,因此它一次只能计算一个请求,但可能在许多请求中有待处理的事件.当你调用`setTimeout`时,它将事件存储在队列中,然后可以开始执行下一个请求.五秒钟后,事件将从队列中删除,并且将执行回调(在这种情况下,该函数包含`console.log`). (7认同)
  • 它不会阻塞线程.此setTimeout之后的代码将继续运行,然后控制台在5秒后打印"hello world". (6认同)