2011-03-30 100 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