【问题标题】:How does the Node.js event loop work with async commandsNode.js 事件循环如何与异步命令一起使用
【发布时间】:2013-07-23 23:54:14
【问题描述】:

第一个问题:

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

第二个问题:

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

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

谢谢,

肖恩。

【问题讨论】:

    标签: node.js


    【解决方案1】:

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

    长答案:

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

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

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

    场景二(无线程池)

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

    场景 3(异步 io、回调)

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

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

    【讨论】:

    • 我认为Node是场景1和场景3的结合。
    • 大多数 IO 是 3(文件 IO 在 linux 上使用线程池,因为那里没有异步文件 API,所以,是的,那里是 1+3)。在 solaris/smartos/windows 上,大多数核心 API 是 3
    • 感谢您的回答,但它是哪一个...节点使用场景 1 2 还是 3?
    • 场景 3 用于 IO 绑定任务,例如 http、数据库、消息队列通信
    猜你喜欢
    • 1970-01-01
    • 2017-06-16
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多