2011-03-30 99 views
22

我在想Node.js中的數據訪問是否需要互斥鎖/鎖。例如,可以說我創建了一個簡單的服務器。該服務器提供了一對耦合協議方法來添加和從內部數組中刪除。我需要用某種類型的互斥鎖來保護內部陣列嗎?Node.js和互斥體

我瞭解Javascript(因此Node.js)是單線程的。我只是不清楚事件是如何處理的。事件是否中斷?如果是這樣的話,我的應用程序可能正在讀數組,中斷以運行事件回調,這會更改數組,然後繼續處理已由事件回調更改的數組。

回答

20

我在想Node.js中的數據訪問是否需要互斥鎖/鎖。

不!在沒有其他代碼可以運行的時候處理事件,這意味着不會有爭用,因爲只有當前運行的代碼才能訪問該內部數組。作爲單線程節點的副作用,長計算將阻塞所有其他事件直到計算完成。

我瞭解Javascript(因此Node.js)是單線程的。我只是不清楚事件是如何處理的。事件是否中斷?

不,事件不會中斷。例如,如果您將while(true){}放入您的代碼中,它將阻止任何其他代碼被執行,因爲總會有另一個要運行的循環迭代。

如果你有一個長期運行的計算,最好使用process.nextTick,因爲這將允許它運行時沒有其他運行(我對此很模糊:下面的例子顯示我' m可能是正確的,它可能不間斷運行)。

如果您有任何其他問題,請隨時停止進入並提出問題。另外,我問了幾個人來看待這一點,並確保我不能完全錯誤的;)

var count = 0; 

var numIterations = 100; 
while(numIterations--) { 
    process.nextTick(function() { 
    count = count + 1; 
    }); 
} 

setTimeout(function() { 

    console.log(count); 

}, 2); 

// 
//=> 100 
// 

由於AAA_awright#node.js的:)

+1

我Node.js的文檔的讀數process.nextTick(回調)是它增加了回調()到隊列中下一個節拍。它沒有說任何關於在返回之前等待打勾或運行滴答事件循環的內容......所以我讀了這段代碼,添加了100個回調函數,將++計數到TODO列表的下一個打勾處......? – Paul 2011-06-04 01:06:25

+0

@保羅更正!/fyi#node.js IRC歡迎你:http://bit.ly/nodeIRC – DTrejo 2012-01-22 23:35:37

27

鎖和互斥的有時候確實需要,即使Node.js是單線程的。

假設您有兩個文件必須具有相同的內容並且沒有相同的內容被認爲是不一致的狀態。現在假設你需要改變它們而不阻塞服務器。如果你這樣做:

fs.writeFile('file1', 'content', function (error) { 
    if (error) { 
     // ... 
    } else { 
     fs.writeFile('file2', 'content', function (error) { 
      if (error) { 
       // ... 
      } else { 
       // ready to continue 
      } 
     }); 
    } 
}); 

您在兩個電話之間不一致的狀態下降,在相同腳本的功能可能是能夠讀取兩個文件。

rwlock模塊非常適合處理這些情況。

+0

這就是我的想法。其他答案不對嗎? – 2015-03-15 10:16:20

+1

答案並不是真的錯,因爲問題是「我需要用某種類型的互斥鎖來保護內部陣列嗎?」 – sheldonh 2015-04-07 14:41:43

+0

假設您有多個運行相同代碼的Node.js服務器實例。 rwlock模塊是處理這個問題還是需要Redis之類的東西? – 2016-09-02 04:03:49

0

我正在尋找節點互斥體的解決方案。互斥體有時是必需的 - 您可能正在運行節點應用程序的多個實例,可能需要確保其中只有一個實體正在做某些特定的事情。我能找到的所有解決方案都不是跨進程或依賴於redis。

所以我做了使用文件鎖定自己的解決方案:https://github.com/Perennials/mutex-node

+0

redis有什麼問題?你能告訴我嗎 ? – 2016-05-28 22:28:50