Node.js和Mutexes

我想知道是否Node.js中的数据访问需要互斥/locking。 例如,可以说我创build了一个简单的服务器。 服务器提供了一对协议方法来添加和删除内部数组。 我需要用某种types的互斥锁来保护内部数组吗?

我懂Javascript(因此Node.js)是单线程的。 我只是不清楚如何处理事件。 事件是否中断? 如果是这样的话,我的应用程序可能正在读取数组的中间,被中断来运行事件callback,这会改变数组,然后继续处理现在由事件callback改变的数组。

我想知道是否Node.js中的数据访问需要互斥/locking。

不! 在没有其他代码可以运行的情况下处理事件,这意味着不会有争用,因为只有当前运行的代码才能访问该内部数组。 作为单线程节点的副作用,长计算将阻塞所有其他事件直到计算完成。

我懂Javascript(因此Node.js)是单线程的。 我只是不清楚如何处理事件。 事件是否中断?

不,事件不会中断。 例如,如果您在代码中放置了一段while(true){} ,则会停止执行任何其他代码,因为循环总是有另一个迭代运行。

如果你有一个长期运行的计算,这是一个好主意,使用process.nextTick ,因为这将允许它运行时没有别的运行(我对此模糊:下面的例子显示,我很可能正确的关于它不间断运行,可能)。

如果您有任何其他问题,请随时停止#node.js并提出问题。 另外,我问了几个人看这个,确保我不是完全错误的;)

 var count = 0; var numIterations = 100; while(numIterations--) { process.nextTick(function() { count = count + 1; }); } setTimeout(function() { console.log(count); }, 2); // //=> 100 // 

感谢#node.js的AAA_awright 🙂

锁和互斥实际上有时是必要的,即使Node.js是单线程的。

假设你有两个文件必须具有相同的内容,而不具有相同的内容被认为是不一致的状态。 现在假设你需要改变它们而不阻塞服务器。 如果你这样做:

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

当两个调用之间存在不一致的状态时,同一脚本中的另一个函数可能会读取这两个文件。

rwlock模块是完美的处理这些情况。

我正在寻找节点互斥的解决scheme。 互斥体有时是必需的 – 您可能正在运行节点应用程序的多个实例,可能需要确保其中只有一个正在做某些特定的事情。 我能find的所有解决scheme都不是跨进程或依赖于redis。

所以我使用文件locking自己的解决scheme: https : //github.com/Perennials/mutex-node