NextTick()不工作

我正在阅读http://howtonode.org/understanding-process-next-tick但是,它附带的代码并未执行CPU密集型任务。

我试图写我的版本。 但这是错误的。

在compute()被执行后,没有任何IO正在服务。

所以,我的问题是:在这种情况下使用nextTick()函数的正确方法是什么?

当compute()正在执行时,我不想阻塞IO。

var http = require('http'); function compute() { // performs complicated calculations continuously // ... var result = 0; for(var i = 0; i < 1000000; i++){ for(var j = i; j < 1000000; j++){ result += i + j; } } process.nextTick(compute); } http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World'); }).listen(5000, '127.0.0.1'); compute(); 

nextTick简单地安排你的函数在事件循环的下一个nextTick被调用。 它没有赋予这个function神奇的非阻塞属性; JavaScript仍然是单线程的。 如果function块(通过执行大量的CPU绑定工作),它仍然会导致I / O事件排队,直到function完成。

如果您需要执行CPU密集型工作, 请在工作进程中执行此操作 。

nextTick是一个阻塞调用(至less在节点v0.10.29中,我testing过了),它阻止了其他事件的运行。 使用setImmediate()

setImmediate将更好地工作,如我的博客文章setTimeout和Friends中所解释的,因为它将允许IO任务在再次locking主执行线程以执行完整的compute运行之前运行。 但正如其他答案张贴,认为这不是“ nextTick不工作”的方式,但也许“哎呀我想做的唯一的事情,你绝对不能做一个node.js应用程序之一我得到了我被警告的结果“。 因为它是合作的多任务处理,所以不能在节点中执行线程。 将计算分解成小块,使用外部进程助手,将某些东西分解成一个支持的C ++库等等。

我会稍微改写一下你的代码。 假设我们需要处理1000000个项目,并有一个(cpu绑定,但有时可以调用)函数computeItem()和io-bound postItem() 。 我们希望在后台处理尽可能多的项目,但仍然具有响应式事件循环。 为了简单起见,没有使用外部工人/队列/服务。 可能的scheme

 var desiredLatency = 10; // ms function doBackgroundWork() { var start = new Date(); var end; var item; while (item = computeItem()) { postItem(item); if (end - start >= desiredLatency) { setImmediate(doBackgroundWork); // resume at next event loop invocation after processing other handlers } } } http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World'); }).listen(5000, '127.0.0.1'); doBackgroundWork();