我正在使用express。
测试node.js理论上,如果我在没有任何回调的“for循环”上运行非常繁重的计算,
它被阻止,其他请求应该被忽略。
但在我的情况下,定期“for loop”
for(var i=0;i<300000;i++) {
console.log( i );
}
不会产生任何请求块,只会产生很高的CPU负载。
它也接受其他请求。
但为什么我应该使用其他一些方法来实现这些非阻塞,例如
process.nextTick()
或者node.js是否使用process.nextTick()作为默认值来处理基本循环函数(for,while)?
答案 0 :(得分:2)
节点在一个带有事件循环的线程中运行,正如您所说,当您的for循环执行时,不会发生其他处理。底层操作系统TCP套接字可能很好地接受传入连接,但如果节点忙于执行循环逻辑,那么请求本身将不会被处理直到之后。
如果你绝对必须运行一个长期运行的processin节点,那么你应该使用单独的工作进程来进行计算,并让主事件循环进行请求处理。
答案 1 :(得分:0)
Node不会使用process.nextTick()
包装循环。
可能是您的程序继续接受新连接,因为console.log
正在将控制权交还给主事件循环;因为它是一个I / O操作。