Node.js事件循环如何与异步命令一起使用

时间:2013-07-23 23:54:14

标签: node.js

第一个问题:

我是一名学习Node的高级开发人员,并且有几个基本问​​题。 我理解它是异步的,没问题,但是如果2个客户端访问节点服务器,并且都运行SQL查询,那么添加到堆栈的第一个查询是一个长查询(db需要1+分钟才能返回数据),而第二个客户端运行一个短的数据库查询(只有几秒钟),第二个查询是否会返回结果(因此甚至不执行),直到第一个异步查询(长一个)完成?

第二个问题:

如果客户端A连接到节点服务器并运行多个异步命令,那么在最后一个异步命令完成之前,每个命令都不会开始执行吗?

我知道有一个事件循环,但试图了解它在节点中的工作方式......

谢谢,

肖恩。

1 个答案:

答案 0 :(得分:3)

简短回答:1) - 否(但如果db协议本身在接受下一个之前需要先完成命令,则可能是肯定的,这是Mysql的情况); 2) - 不,从用户的角度来看,它们并行运行

答案很长:

想象一下,您的工作是接受来自客户的电话,并根据问题发送给相应的客户支持(您有10个第三方服务,每个服务都有客户支持热线)。所有线路都非常繁忙,需要几分钟才能回答。答案本身通常很短。

场景1(20个线程,线程池):

您有10条来电线路。拨打电话有10条电话线。您接听来电,收听问题并拨打电话。 “请等待答案”给客户。在此期间,您手中还有20条其他线路,在切换到检查下一条线路之前,您会问 客户或支持等待。

场景2(无线程池)

与方案1相同,但最初您有一个输出线。如果您有来电并且您有外线忙,您要求所有客户等待,然后您去电话公司安排新线路(创建新线程)。

场景3(异步io,回调)

一行(=执行线程)。你接听电话,写下问题和来电显示和结束通话,“谢谢你的问题,我会在几分钟后给你回电话”回复。你称之为“异步”客户支持,但不要在队列中等待,而只是告诉短消息:“我的id是xxx,问题是yyy”和结束通话。

每次您从客户支持部门获得回复(回拨)时,请将其写下来,然后在客户端问题列表中查找客户端ID,呼叫客户端,告诉他答案并丢弃具有关联客户端ID< - >的记录。问题< - >回答。每次您收听客户的问题或致电支持部门发送问题或接听答案或致电客户端并给出答案 - 其他客户端在队列中等待。 (你正在阻止事件循环),所以对你来说,尽可能少地使用行是很重要的,而支持答案时间则不那么重要。