2015-09-02 119 views
0

我我已經使用cluster模塊基本設置:(我有6芯)聚類循環混亂

var cluster = require('cluster'); 
if (cluster.isMaster) { 
    var numCPUs = require('os').cpus().length; 
    for (var i = 0; i < numCPUs; i++) { 
     cluster.fork(); 
    } 
}else{ 
//Code here 
    console.time("Time: "); 
    var obj = {'abcdef' : 1, 'qqq' : 13, '19' : [1, 2, 3, 4]}; 
    for(var i = 0; i < 500000; i++) { 
      JSON.parse(JSON.stringify(obj)); 
    } 
    console.timeEnd("Time: "); 
} 

如果我要運行該測試。 它會輸出:

但是......如果我跑了cluster.isMaster塊中完全相同的測試,它會輸出:

1)爲什麼正在執行我的代碼多次而不是一次?

2)由於我有6 cpu cores幫助我運行該測試,不應該只運行該代碼一次,但更快地執行操作?

+1

Javascript的一個給定部分,例如'for'循環只能運行在一個特定的集羣上。集羣用於在自己的集羣中運行多個操作(例如多個傳入的http請求),這樣獨立的請求可以在單獨的核心上並行運行。 – jfriend00

回答

1
  1. 你正在分叉os.cpus().length單獨過程。因此,如果os.cpus().length === 6,那麼你應該看到6個單獨的輸出(這是你已經發布的輸出的情況)。
  2. 不,這不是它的工作原理。每個過程將安排在一個單獨的核心上。這不是關於更快運行,但能夠做更多處理並行
+0

'並行處理',這有很大幫助。所以說,如果我有一個每2秒運行一次的全局循環(它是我的遊戲的一部分),它將基本上每2秒運行6次?這可能超出範圍,但是我的循環遍歷一個LARGE對象並對其進行操作(刪除並通過websockets等發送數據),最好不要在fork中有這個循環,對嗎? –

+0

JSON解析不是真正可並行化的東西,除非您可以以某種方式將所有內核/工作者之間的工作分開(這不太可能,因爲節點的集羣使用JSON在主和工作者之間進行通信,所以最終只會得到重新串聯和重新解析,這是一種浪費)。無論如何,你應該總是測試不同的場景,以查看使用工作者實際*是否提高了績效。 – mscdex

+0

是的,我只是無法環繞我的全局循環運行6次,每2秒而不是每2秒。它似乎會增加負載,而不是提高性能。也許我會做一些測試,並回到其他問題。 –