我在Google上找不到很好的答案,所以我在这里尝试。
我的应用程序包括:Express.js,node.js和一个MySQL数据库。但是,此应用程序需要为多个客户端提供服务。
在我的代码中,我需要使用回调,以便程序在继续之前等待数据库查询完成。这会影响想要同时访问数据库的其他用户吗?
答案 0 :(得分:4)
要明确回答这个问题,我认为需要对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)那里有几篇文章,它们只是Google搜索的内容,包括性能差异,预期的网络负载延迟以及各种解决方案。
我希望这会有所帮助!