我正在使用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个不同的连接客户端,结果将是相同的?
在此先感谢您能帮助我!我无法对大量已连接的客户进行测试以确认自己是否正确。
(很抱歉,如果这是一个菜鸟问题,我不是专业人士)
答案 0 :(得分:0)
直接取决于发出函数,它是同步还是异步?
异步库不会阻止您的事件循环,它通过回调来处理事情, 现在所有1000000回调都在队列中等待被调用,现在每当事件循环将函数逐一取出函数到调用堆栈时, emit 函数就完成所有任务(一些繁重的操作)在同一线程或唯一事件循环中,这将使其他999999回调等待,但是如果.emit函数将任务卸载到其他运行程序,例如db call,让mongodb表示,node js驱动程序将执行io的任务卸载到了mongodb服务器,并在不阻止事件循环的情况下继续运行。基本上检查发射在做什么。如果它不会做很多事情,那么可以肯定它不会阻止您的唯一事件循环。