gpt4 book ai didi

javascript - nodeJS 异步与同步

转载 作者:搜寻专家 更新时间:2023-11-01 00:30:07 39 4
gpt4 key购买 nike

在 nodeJS 中,一般做法和建议是使用async 方法并对下一个函数进行回调。

我使用 expressJS 设置了一个 nodeJS出于测试目的,我编写了 syncasync 方法。无论是使用async 还是 sync 方法,这两种方法都有效并且 express 将响应所有请求而没有任何可察觉延迟。

虽然我在我的项目中使用了async方法,但是我看到的鼓励使用async方法的文章并没有深入解释为什么。Sync 方法会避免 callback hell .

所以我很好奇,为什么不使用 sync 方法,因为它们都有效?使用一个或另一个会影响响应时间/性能吗?

最佳答案

Node 在单线程上运行。如果您正在处理大量连接,那么 IO 绑定(bind)任务肯定会多于 CPU 绑定(bind)任务。例如,数据库调用。在等待数据库查询结果的同时,您可以接收更多请求,或者做其他工作。

当您需要做一些受 CPU 限制的事情时,问题就出现了:一项可能需要很长时间的任务。您需要拆分任务,只做其中的一小部分,然后将其余部分安排到稍后的时间直到完成,或者您可以将其委托(delegate)给另一个服务器/进程,无论如何。

如果您决定进行同步,服务器在执行该作业时将不会再处​​理任何请求。是的,您将避免回调 hell ,但代价是无论多长时间,都要从头到尾完成一项任务。如果您尝试处理大量连接,这就不太好了。

当出现问题时,一个很好的例子是 for 循环:

for (let x of ['some', 'huge', 'array']) {
// Do something heavy here, until it's not finished, server won't do
// anything more than this heavy task
}

在“做某事”时,服务器应用程序不会处理任何其他传入请求。当然,当你的任务比较重,请求很多的时候,问题就严重了。

在一个严肃的 Node 服务器中,您不需要同步循环,除非它因为 X 动机而比异步解决方案执行得更好。因此,您使用 setTimeout、setImmediate、process.nextTick、Promises 等进行异步操作。而且,您采用的第一种方法可能是采用连续传递样式,这意味着传递要在工作完成后执行的回调,并且您可能会撞到回调 hell 墙。

这就是您使用 Promises 或生成器或两者的时刻: https://davidwalsh.name/async-generators

这样,您将避免回调 hell ,并获得更好的代码(主观)。你也可能想关注异步/等待:https://github.com/tc39/ecmascript-asyncawait .

您没有任何显着优势,因为您是唯一提出请求的用户。例如,使用数千个连接进行测试。

阿布拉佐。

关于javascript - nodeJS 异步与同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39427809/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com