Node.js通过socket.io同时写入对象属性



在Node.js中,当一个全局对象的不同属性同时写入(使用socket.io请求(时,其中一个属性会保留其原始值吗?

`

var rooms = {
a: {
move: 1
},
b: {
move: 2
}
};
// it's called same time from different client with different room id
socket.on('onmove', function(data) {
var room = rooms[data.room_id];
room.move = data.move;
});

`

我试着测试,但没有互相碰撞。然而,我有一个网络游戏,其中的异常指向这一点。问题是,这在理论上可能吗?如何覆盖属性?一个对另一个有影响吗?

Nodejs在一个线程中运行您的Javascript,因此没有两个请求实际同时执行您的Javascript。因此,您显示的代码本身不会受到种族条件的影响。

问题是,这在理论上可能吗?

不,不仅仅是您显示的代码。move事件处理程序将在调用任何其他请求或事件之前运行到完成。

如何覆盖属性?一个对另一个有影响吗?

否。指定给一个属性不会影响其他属性。


也就是说,在nodejs中肯定有一些与并发相关的事情需要注意,特别是当请求处理程序正在执行异步操作时。这是因为,在等待调用某个异步完成回调时,其他请求可以运行、更改状态等。因此,如果一个请求处理程序获取某个状态,然后执行异步操作,并期望该状态在等待调用异步回调时不会更改,那么它可能会导致并发问题,因为其他请求处理程序可以在这段时间内运行,并可能影响服务器端状态。

此外,还有许多数据库操作需要仔细编码,以避免并发问题,因为两个请求可能试图对数据库进行冲突的更改,或者一个请求处理程序可能会获取一些数据,修改并写回,而另一个请求处理程序正在做同样的事情,导致一个请求的更改被覆盖。

因此,如果你怀疑这段代码在某种程度上涉及并发问题,那么我建议你披露更多相关的代码,这样我们就可以看看你编写其余相关代码的方式是否会导致并发问题。

最新更新