Как узел обрабатывает события? По одному или одновременно?

Мне нужно знать, будет ли одновременный доступ к общему массиву, как в следующем примере:

var ws          = require("./ws.js"),
    connections = [];

ws.createServer(function( socket ){

  // add to connection array
  socket.on('connect', function(){
    connections.push(socket);
  });

  // remove from connection array
  socket.on('close', function(){
    var i = connections.indexOf(socket);
    connections.splice(i,1);
  });

}).listen(8000);

Когда клиент подключается, его сокет помещается в массив. Когда соединение закрыто, я хочу удалить его из массива соединений.

Но на других языках это может привести к проблемам с параллелизмом.

Fx. Если два соединения закрываются одновременно:

  • Соединение A находит свое гнездо в индексе 4
  • Соединение B находит свое гнездо в индексе 5
  • Соединение A удаляется из индекса 4
  • Соединение B удаляет себя из индекса 5 (но теперь это индекс 4)

Будет ли это когда-нибудь проблемой, или я могу предположить, что одновременно обрабатывается только один обратный вызов?

Задача любезно предоставлена: Майкл Андерсен

Решение

Нет, это не будет проблемой, потому что ваш код node.js выполняется в одном потоке. У вас не будет одной и той же функции, вызываемой одновременно.

Решение предоставлено: Caolan

Просмотреть дополнительное обсуждение.