节点JS,Socket.io,异步和阻塞事件循环

时间:2018-08-05 12:28:09

标签: node.js loops asynchronous events socket.io

我正在使用Caolan的Node JS,Socket.io和Async模块开发应用程序。

我想问一些有关向很多客户发出信号,以及是否阻止事件循环的问题。

要在我的应用程序中使用,我需要堆叠套接字(已连接的客户端信息),并设法确定需要向谁发送消息。

因此,一旦我知道需要向谁发送信息,就可以使用Async.each遍历客户端,以将数据发送给客户端。

示例:

    async.each(clientsIds,
      function(item,cb)
      {
        clients[item].emit('sendData', datas);
    cb();
      },
      function(err)
      {

      }
    );  

所以我的问题是:如果我连接了1000000个客户端,它将在发送数据时阻止事件循环直到发送到所有客户端吗?

我一个人连接时,尝试向自己发出1000000次,它会阻塞事件循环,直到函数运行完毕。是因为我要向同一客户端发送1000000,还是如果它是1000000个不同的连接客户端,结果将是相同的?

在此先感谢您能帮助我!我无法对大量已连接的客户进行测试以确认自己是否正确。

(很抱歉,如果这是一个菜鸟问题,我不是专业人士)

1 个答案:

答案 0 :(得分:0)

直接取决于发出函数,它是同步还是异步?

异步库不会阻止您的事件循环,它通过回调来处理事情, 现在所有1000000回调都在队列中等待被调用,现在每当事件循环将函数逐一取出函数到调用堆栈时, emit 函数就完成所有任务(一些繁重的操作)在同一线程或唯一事件循环中,这将使其他999999回调等待,但是如果.emit函数将任务卸载到其他运行程序,例如db call,让mongodb表示,node js驱动程序将执行io的任务卸载到了mongodb服务器,并在不阻止事件循环的情况下继续运行。基本上检查发射在做什么。如果它不会做很多事情,那么可以肯定它不会阻止您的唯一事件循环。