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();
- V8caching是否自动编译正则expression式?
- kafka节点js客户端压缩问题与snappy
- 如何得到一些错误的文件丢失?
- ER_CON_COUNT_ERROR:node-mysql中的连接错误太多
- Mongoose – 如何确定一个嵌套的对象是否已经存在于一个查询中?
- configuration快递为每个url发送index.html除了那些以.css和.js结尾的文件
- 为什么如果道具数大于8,NodeJS对象创build的性能如此糟糕?
- 从PhantomJS站点上的Ajax请求获取状态代码
- Nodejs返回Blockchain Rates API的完整JSON,但是我不能访问它里面的特定对象。 为什么?