0

我有用户连接到 Node.js 服务器,当他们加入时,我将他们添加到 Lobby(本质上是一个队列)中。每当大厅中有 2 个用户时,我希望他们配对并从大厅中删除。所以本质上,它只是一个简单的队列。

我首先尝试使用 Lobby.run 方法来实现这一点,该方法具有无限循环(在process.nextTick调用中开始),并且只要队列中有两个以上的条目,我就会将它们从队列中删除。然而,我发现这正在吃掉我所有的记忆,而且像这样的无限循环通常是不明智的。

我现在假设通过发出事件EventEmitter是要走的路。但是,我担心的是同步。假设我的大厅非常简单:

Lobby = {
  users: []

, join: function (user) {
    this.users.push(user);
    emitter.emit('lobby.join', user);
  }

, leave: function (user) {
    var index = this.users.indexOf(user);
    this.users.splice(index, 1);
    emitter.emit('lobby.leave', user);
  }
};

现在基本上我假设我想观察加入大厅的用户并将他们配对,可能是这样的:

Lobby = {
  ...

, run: function () {
    emitter.on('lobby.join', function (user) {
      // TODO: determine if this.users contains other users,
      //       pair them off, and remove them from the array
    });
  }
}

正如我所提到的,这不考虑同步。多个用户可以同时加入大厅,因此事件侦听器可能会将单个用户与多个其他用户配对,而不是只配对一个。

有更多 Node.js 经验的人可以告诉我关注这种基于事件的方法是否正确?任何改进这种方法的见解将不胜感激。

4

1 回答 1

2

你担心这个是错误的。这是因为 Node.JS 是单线程的,根本没有并发!每当一个代码块被触发时,在该块完成它所做的事情之前,都不能触发其他代码(包括事件处理程序)。特别是如果您在应用程序中定义这个空循环:

while(true) { }

然后您的服务器崩溃了,不会触发其他代码,也不会处理其他请求。所以要小心代码块,确保每个块最终都会结束。

回到问题......所以在你的情况下,多个用户不可能与同一个用户配对。让我再说一遍:这仅仅是因为 Node.JS 中没有并发!

另一方面,这只适用于 Node.JS 的一个实例。如果你想把它扩展到多台机器上,那么显然你必须实现一些锁定机制(确保没有其他进程可以同时处理数据)。

于 2012-08-09T15:25:53.897 回答