0

第一个问题:

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

第二个问题:

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

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

谢谢,

肖恩。

4

1 回答 1

3

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

长答案:

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

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

您有 10 条电话线用于来电。您有 10 条用于拨出电话的电话线。您接听来电,听问题并拨打电话。“请等待答复”给客户。与此同时,您手中还有 20 条线路,在切换到下一条线路之前,您要求客户或支持人员等待。

场景二(无线程池)

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

场景 3(异步 io、回调)

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

每次您从客户支持收到回复(回电)时,您都将其写下来,然后在客户问题列表中查找客户 ID,致电客户,告诉他回答并丢弃关联客户 ID <-> 问题 <-> 回答的记录. 每次您收听客户的问题或致电支持以发送问题或接收答案或致电客户回答时 - 其他客户在队列中等待。(您正在阻塞事件循环),因此对您而言,尽可能少地使用线路很重要,而支持应答时间则不太重要。

于 2013-07-24T01:36:41.543 回答