【发布时间】:2018-09-15 12:02:26
【问题描述】:
我在 Google 上没有找到好的答案,所以我在这里尝试。
我的应用程序包括:Express.js、node.js 和 MySQL 数据库。但是,此应用程序需要为多个客户端提供服务。
在我的代码中,我需要使用回调,以便程序在继续之前等待数据库查询完成。这会影响其他想要同时访问数据库的用户吗?
【问题讨论】:
标签: javascript mysql node.js express
我在 Google 上没有找到好的答案,所以我在这里尝试。
我的应用程序包括:Express.js、node.js 和 MySQL 数据库。但是,此应用程序需要为多个客户端提供服务。
在我的代码中,我需要使用回调,以便程序在继续之前等待数据库查询完成。这会影响其他想要同时访问数据库的用户吗?
【问题讨论】:
标签: javascript mysql node.js express
要明确回答这个问题,我认为需要对 Node.js 异步事件循环有更深入的了解。
JavaScript 是单线程的,使用这个异步事件循环允许 Node.js 在这个单线程上执行非阻塞 I/O 操作。
它实现这一点的方法是在需要时(例如当有大量请求或 I/O 操作时)将操作卸载到内核,然后在事件的稍后时间将结果重新拾取循环,在“轮询”阶段。
为了进一步说明,我在 Node.js 文档中包含了图表:
┌───────────────────────────┐
┌─>│ timers │
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │ pending callbacks │
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │ idle, prepare │
│ └─────────────┬─────────────┘ ┌───────────────┐
│ ┌─────────────┴─────────────┐ │ incoming: │
│ │ poll │<─────┤ connections, │
│ └─────────────┬─────────────┘ │ data, etc. │
│ ┌─────────────┴─────────────┐ └───────────────┘
│ │ check │
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
└──┤ close callbacks │
└───────────────────────────┘
可以在以下位置详细了解这些阶段:https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
简而言之:
同样,大部分内容来自 Node.js 文档,但我已经详细阐述了一些细节,以便在此上下文中提供一些理解。
在您的情况下,您的数据库操作不会“阻止”其他用户,他们只需要等到通过循环处理他们的回调。如果同时有许多操作,更多操作将被卸载到内核,然后尽快恢复,这可能会提供一些轻微的额外延迟(1)。
另一个有助于可视化此过程的好图形来自这篇文章:https://webapplog.com/you-dont-know-node/
附注——
在某些地方,Node.js 的事件循环是一个很好的解决方案,而在其他地方,更强大的多线程解决方案可能是更好的方法。确保您进行必要的研究,以便明智地做出与项目细节相关的决定,这绝不是一个坏主意。
(1) 有几篇文章只是谷歌搜索,关于性能差异、网络负载过重的预期延迟以及解决此问题的各种解决方案。
我希望这会有所帮助!
【讨论】: