我是否需要担心Node.js中的并发修改?

时间:2016-07-12 03:40:10

标签: javascript node.js concurrency socket.io

我正在用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)
}

问题:在循环运行disconnect时,套接字(2)事件是否存在从connections对象中删除项(3)的风险抛出错误?如果是这样,最佳做法是什么?

我可以&#34;标记它&#34;要删除,只在循环完成后删除它,但是有必要吗?谢谢!

2 个答案:

答案 0 :(得分:3)

没有风险。

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

答案 1 :(得分:2)

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