gpt4 book ai didi

javascript - Node.js - 同步操作中推荐的最长时间

转载 作者:搜寻专家 更新时间:2023-10-31 23:47:16 25 4
gpt4 key购买 nike

同步插件会阻塞Node.js的事件循环。但也许存在一个“标准”限制来阻止事件循环。

var results = addon.my_function(parameters); //consumes 2ms

我的函数消耗 2 毫秒。此时此刻,我想知道将其更改为异步方式的工作是否会得到最终的性能返回。

最佳答案

您可能知道 node.js 有一个并发模型,它只处理 IO 绑定(bind)任务的并发。任何未被分解的串行任务都会在该持续时间内暂停事件循环。可以实现例程来分解此任务,但它仅适用于特定范例。如果您正在执行一项需要花费大量时间的操作,那么您应该研究并行性。如果您正在逐行处理数据集,例如数组或文件,您可以实现一个递归函数来替换循环,当您递归而不是直接调用您的函数时,您可以使用 setTimeout 延迟它。这样你就可以恢复你的事件循环以避免停止它太久(到发生超时的地方)。

我不能给你一个同步任务被认为“太长”的确切时间。这真的取决于。因素太多了。这项任务发生的频率确实会有所不同。

有多种方法可以处理这些类型的任务:

  1. 分解连续任务。设置超时以分解事件循环中的部分任务,就像我之前提到的那样。尽管如果您有足够多的这些任务,它仍然会导致问题。
  2. 考虑并行性。并行性对于从事件循环中删除串行任务来说并不是一个坏概念,但前提是该事件不经常发生。并行性有很多开销。
  3. 卸载给 worker 。将这些事件推给一个 worker 或一组 worker 。这很常见,唯一的缺点是运营成本略有增加(可能),如果您不小心,您可能会创建一些难以维护的东西(许多没有中央约定的小型系统)。
  4. 排队和限制并发。如果任务很短,但很频繁,您可以简单地将它们排队,并确保一次只处理其中的几个,这样您的事件循环就不会被阻塞太久。

如果您的进程耗时 2 毫秒,很可能您只需让事件循环处理它就可以了。阻塞事件循环 2 毫秒不是什么大问题。如果这些类型的任务很频繁(每秒多次),那么您可能需要考虑卸载给工作人员或者可能创建某种队列或某种方法来限制一次处理的数量。否则,您可能会偶然发现响应缓慢的问题。现在我认为你会没事的,除非这是一项非常常见的任务。

如果您的任务是 IO 绑定(bind)的,那么将其更改为异步的工作应该是微不足道的,因为 nodejs 是使用这种范例从头开始构建的。如果可能的话不使用异步方法是不好的做法。虽然这只与 IO 有关。如果您的任务不是从某个来源读取/写入数据,那么异步方法绝对不会为您做任何事情。

关于javascript - Node.js - 同步操作中推荐的最长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34637795/

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