Node.js和Mutexes

mel*_*oon 29 javascript node.js

我想知道Node.js中的数据访问是否需要互斥锁/锁.例如,假设我创建了一个简单的服务器.服务器提供了一些协议方法来添加和删除内部数组.我是否需要使用某种类型的互斥锁来保护内部阵列?

我理解Javascript(因此Node.js)是单线程的.我不清楚如何处理事件.事件中断吗?如果是这种情况,我的应用程序可能正在读取数组,被中断以运行更改数组的事件回调,然后继续处理现在由事件回调更改的数组.

Alb*_*cca 36

有时锁定和互斥锁必需的,即使Node.js是单线程的.

假设您有两个必须具有相同内容但没有相同内容的文件被视为不一致状态.现在假设你需要在不阻塞服务器的情况下更改它们.如果你这样做:

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

当两个调用之间处于不一致状态时,同一脚本中的另一个函数可能能够读取这两个文件.

rwlock中模块完美地处理这些情况.

  • 这是我的想法。另一个答案是不是错了? (2认同)
  • 答案并没有真正错误,因为问题是“我需要使用某种类型的互斥锁来保护内部数组吗?” (2认同)

DTr*_*ejo 24

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

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

我理解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
//
Run Code Online (Sandbox Code Playgroud)

感谢#node.js的AAA_awright :)

  • 我真的不明白那些一直说“Node.js 是单线程”的人。没有什么可以阻止人们启动同一脚本的多个进程或多个不同的进程。甚至可能在不同的机器上。`pm2` 可以自动启动多个进程。并且不要忘记像“fork”这样的命令。 (2认同)
  • @Gherman 启动多个进程的可能性并不意味着 Node.js 支持多线程。 (2认同)