Javascript Node.js和互斥体
我想知道Node.js中的数据访问是否需要互斥锁/锁。例如,假设我创建了一个简单的服务器。服务器提供了两种协议方法,可以添加到内部阵列中,也可以从内部阵列中删除。我是否需要使用某种类型的互斥来保护内部阵列 我理解Javascript(因此Node.js)是单线程的。我只是不清楚事件是如何处理的。事件是否中断?如果是这样的话,我的应用程序可能在读取数组的中间,被中断以运行一个事件回调来改变数组,然后继续处理现在由事件回调改变的数组。 我想知道Node.js中的数据访问是否需要互斥锁/锁 不!事件在没有其他代码运行时被处理,这意味着不会有争用,因为只有当前运行的代码可以访问该内部数组。作为节点是单线程的副作用,长时间的计算将阻止所有其他事件,直到计算完成 我理解Javascript(因此Node.js)是单线程的。我只是不清楚事件是如何处理的。事件是否中断 不,事件不会被中断。例如,如果在代码中放入Javascript Node.js和互斥体,javascript,node.js,Javascript,Node.js,我想知道Node.js中的数据访问是否需要互斥锁/锁。例如,假设我创建了一个简单的服务器。服务器提供了两种协议方法,可以添加到内部阵列中,也可以从内部阵列中删除。我是否需要使用某种类型的互斥来保护内部阵列 我理解Javascript(因此Node.js)是单线程的。我只是不清楚事件是如何处理的。事件是否中断?如果是这样的话,我的应用程序可能在读取数组的中间,被中断以运行一个事件回调来改变数组,然后继续处理现在由事件回调改变的数组。 我想知道Node.js中的数据访问是否需要互斥锁/锁 不!事件在
while(true){}
,它将停止执行任何其他代码,因为循环总是要运行另一个迭代
如果您有一个长时间运行的计算,那么使用它是一个好主意,因为这将允许它在没有其他运行的情况下运行(我对此很模糊:下面的示例表明,我可能正确地认为它可以不间断地运行)
如果你有任何其他问题,请随时停下来提问。另外,我让几个人看看这个,确保我没有完全错;)
多亏了AAA#awright of#node.js:)有时确实需要锁和互斥锁,即使node.js是单线程的 假设您有两个必须具有相同内容的文件,并且不具有相同内容被视为不一致状态。现在假设您需要在不阻塞服务器的情况下更改它们。如果您这样做:
fs.writeFile('file1', 'content', function (error) {
if (error) {
// ...
} else {
fs.writeFile('file2', 'content', function (error) {
if (error) {
// ...
} else {
// ready to continue
}
});
}
});
当同一脚本中的另一个函数可能能够读取这两个文件时,两个调用之间的状态不一致
该模块非常适合处理这些情况。我正在寻找节点互斥体的解决方案。互斥锁有时是必要的——您可能正在运行节点应用程序的多个实例,并且可能希望确保其中只有一个在做某些特定的事情。我能找到的所有解决方案要么不是跨流程的,要么依赖于redis
因此,我使用文件锁制定了自己的解决方案:对于许多后端实现来说,互斥绝对是必要的。考虑一个类,您需要通过构建一个承诺链来保持异步执行的同步性。
let _ = new WeakMap();
class Foobar {
constructor() {
_.set(this, { pc : Promise.resolve() } );
}
doSomething(x) {
return new Promise( (resolve,reject) => {
_.get(this).pc = _.get(this).pc.then( () => {
y = some value gotten asynchronously
resolve(y);
})
})
}
}
你怎么能确保一个承诺不会因为种族条件而悬而未决?令人沮丧的是,node没有将互斥体设置为本机,因为javascript本质上是异步的,将第三方模块引入流程空间始终是一个安全风险。我对process.nextTick(callback)的node.js文档的理解是,它将callback()添加到队列中以备下一次使用。它没有说在返回之前等待滴答声或运行滴答声事件循环。。。因此,我将这段代码解读为将100个count++回调添加到下一个tick的TODO列表中??我真的不明白有人一直说“Node.js是单线程的”。没有任何东西可以阻止一个人启动同一脚本或多个不同脚本的多个进程。甚至可能在不同的机器上<代码>pm2可以自动启动多个进程。不要忘记像
fork
这样的命令。这就是我的想法。另一个答案不是错了吗?答案不是真的错了,因为问题是“我是否需要使用某种类型的互斥来保护内部阵列?”假设您有多个Node.js服务器实例运行相同的代码。rBlock
模块是否处理此问题,或者您是否需要类似Redis的东西?
let _ = new WeakMap();
class Foobar {
constructor() {
_.set(this, { pc : Promise.resolve() } );
}
doSomething(x) {
return new Promise( (resolve,reject) => {
_.get(this).pc = _.get(this).pc.then( () => {
y = some value gotten asynchronously
resolve(y);
})
})
}
}