2012-01-11 69 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操作。