【问题标题】:Do I need to worry about Concurrent Modification in Node.js?我需要担心 Node.js 中的并发修改吗?
【发布时间】:2016-07-12 03:40:10
【问题描述】:

我正在使用 Node.js 和 Socket.io 编写一个小型聊天应用程序。我有一个对象connections,它保留对所有实时连接的引用,例如(伪代码):

var connections = {};
...
io.on("connection", function(socket)){
  connections[socket.id] = socket;       // (1)

  socket.on("disconnect", function(){
    delete connections[socket.id];       // (2)
  });
}

现在在代码的另一部分我迭代连接对象,例如:

for (var i=0; i<connections.length; i++) {
  // do something with connections[i]    // (3)
}

问题:当循环运行(3) 时,套接字的disconnect 事件是否会从connections 对象中删除一个项目(2) 并引发错误?如果是这样,最佳做法是什么?

我可以将其“标记”为删除,并且仅在循环完成后将其删除,但是有必要吗?谢谢!

【问题讨论】:

  • 不,JavaScript 是单线程的。当循环运行时,没有其他代码可以运行。

标签: javascript node.js concurrency socket.io


【解决方案1】:

不需要,节点单线程运行您的代码。只要您在迭代时执行的操作是同步的,socket.io 回调就不会交错。

【讨论】:

    【解决方案2】:

    没有风险。

    JS 进程是单线程的,在你的循环完成之前不会触发回调。

    【讨论】:

      猜你喜欢
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2014-08-12
      相关资源
      最近更新 更多