2012-01-11 70 views
1

我用express来测试node.js。当我使用node.js时,我应该使用循环异步方式吗?

从理论上说,如果我运行没有任何回调的一个个“for循环”的东西很繁重的计算,

它被阻塞和其他请求应被忽略。

但对我来说,常规的“for循环”

for(var i=0;i<300000;i++) { 
    console.log(i); 
} 

不作任何请求块,但只是高CPU负载。

它也接受其他请求。

,但我为什么要使用一些其他的方法,使这些非粘连如

process.nextTick() 

或根本node.js的照顾基本环路功能(同时)与process.nextTick他们包裹()作为默认值?

回答

2

节点在带有事件循环的单个线程中运行,如您所说,执行for循环时不会发生其他处理。底层操作系统TCP套接字可以很好地接受传入连接,但是如果节点忙于执行循环逻辑,那么请求本身将不会被处理,直到之后才处理。

如果您绝对必须在Node中运行一些长时间运行的流程,那么您应该使用单独的工作进程来执行计算,并让主事件循环进行请求处理。

+0

在“for循环”中使用process.nextTick或在“for循环”中使用process.nextTick之间的区别 – InspiredJW 2012-01-11 07:30:47

+2

片段会帮助我更好地回答,但基本上没有nextTick循环就像其他任何语言一样运行。它会一直运行,直到它经历了'我'的所有值,并且不会发生其他处理。 nextTick指示节点通过事件循环下次执行参数函数。从理论上讲,这意味着您正在排队处理以在事件循环中运行,以及其他所有事件。这意味着有时间处理其他数据,例如传入请求。也就是说,主循环仍然会进行大量繁重的处理,这可能很糟糕。 – loganfsmyth 2012-01-11 08:10:30

0

节点不会用process.nextTick()来包装循环。

这可能是因为你的程序正在继续接受新的连接,因为console.log正在控制回主事件循环;因为这是一个I/O操作。