Node.js-同步操作中建议的最长时间

Node.js - Maximum time recommended in synchronous operations

本文关键字:长时间 js- 同步操作 Node      更新时间:2023-09-26

同步插件会阻塞Node.js的事件循环。但是,可能存在一个"标准"限制来阻止事件循环。

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

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

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

我无法给出同步任务被认为"太长"的确切时间。这真的取决于情况。因素太多了。这项任务发生的频率真的很重要。

处理这类任务有多种方法:

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

如果你的进程需要2ms,那么让事件循环来处理它很可能会很好。阻止事件循环2ms并不是什么大不了的事。如果这些类型的任务很频繁(每秒多次),那么您可能需要考虑将其卸载给工作人员,或者可能创建某种队列或某种方法来限制一次处理的数量。否则,你可能会遇到反应缓慢的问题。现在我想你会没事的,除非这是一项非常普通的任务。

如果您的任务是IO绑定的,那么将其更改为异步的工作应该是微不足道的,因为nodejs是用这种范式从头开始构建的。如果在可能的情况下不使用异步方法,这是一种糟糕的做法。虽然这只和IO有关。如果您的任务不是从某个源读取/写入数据,那么异步方法将对您毫无帮助。