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

时间:2016-01-06 16:21:26

标签: javascript node.js

同步插件将阻止Node.js的事件循环。但也许,存在阻止事件循环的“标准”限制。

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

我的功能耗时2毫秒。此刻,我想知道将其改为异步方式的工作是否能够带来最终的表现。

1 个答案:

答案 0 :(得分:3)

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

我无法确切地告诉您同步任务被认为“太长”的确切时间。这真的取决于。有太多因素。这项任务发生的频率确实有所不同。

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

  1. 分解一系列任务。设置超时以分解事件循环中的任务部分,就像我之前提到的那样。虽然如果你有足够的这些任务,它仍然会导致问题。
  2. 考虑并行性。并行性对于从事件循环中删除串行任务并不是一个坏概念,但前提是该事件不会经常发生。并行性有很多开销。
  3. 卸载给工人。将这些事件推送给一个工人或一组工人。这是非常常见的,唯一的缺点是运营成本略有增加(可能),如果你不小心,你可以创造一些难以维护的东西(许多没有中心惯例的小系统)。
  4. 排队和限制并发。如果任务很短,但很频繁,您可以简单地将它们排队,并确保一次只处理其中一些,这样您的事件循环就不会被阻止太久。
  5. 如果你的进程花费了2ms,那么你可能只是让事件循环处理它就好了。阻止事件循环2ms并不是什么大问题。如果这些类型的任务频繁(每秒多次),那么您可能需要考虑卸载到工作者或可能创建某种队列或某种方法来限制一次处理的数量。否则你可能会遇到响应缓慢的问题。现在我认为除非这是一项非常普遍的任务,否则你会没事的。

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