【发布时间】:2020-12-16 09:10:48
【问题描述】:
我正在使用 Nodejs Api 服务器并面临一种特殊情况,即一群用户通过布尔指示通知我,并且只有当所有用户向我发送指示时,我才会调用一个方法来完成某些工作。
因此,对于示例,我创建了一个由 5 个已连接用户组成的组,并等待他们的指示, 使用带有输入布尔值的 Http Post 消息发送。所以,在服务器上我持有一个对象如下 -
Group = {
actionPerformed: false,
userOne: false,
userTwo: false,
userThree: false,
userFour: false,
userFive: false
}
在收到来自以下任何用户的消息后,我会更新相关属性,比如说,对于 userOne,我将 Group.userOne 属性设置为 true。然后我检查是否所有其他用户已经发送了他们的指示,所以我执行以下测试 -
if (!Group.actionPerformed &&
Group.userOne &&
Group.userTwo &&
Group.userOne &&
Group.userThree &&
Group.userFour &&
Group.userFive) {
Group.actionPerformed = true;
//do something only once
}
当然,我只想在括号中执行上述代码一次,因此我想避免最后 2 个用户在完全相同的时间发送他们的指示的竞争条件情况,并且两者都将他们的属性设置为 true,并且之后,作为检查条件,第一个用户可能会检查条件 - 结果为真,在将 actionPerformed 设置为真之前,可能会发生线程切换,第二个用户将测试也将结果为真的条件,然后两个用户都将输入括号。
所以我的问题是,所描述的情况是否只能通过对条件和 Group.actionPerformed = true 的原子操作来解决,或者,是否有另一种解决方案,也许更优雅?
更新 - 上面的代码在路由异步方法中执行 -
router.route('/')
.get(passport.authenticate('jwt', { session: false }), async (req, res, next) => {
....
if (!Group.actionPerformed &&
Group.userOne &&
Group.userTwo &&
Group.userOne &&
Group.userThree &&
Group.userFour &&
Group.userFive) {
Group.actionPerformed = true;
//do something only once
}
});
【问题讨论】:
标签: node.js atomic race-condition