Node.js-同步操作中建议的最长时间
Node.js - Maximum time recommended in synchronous operations
同步插件会阻塞Node.js的事件循环。但是,可能存在一个"标准"限制来阻止事件循环。
var results = addon.my_function(parameters); //consumes 2ms
我的函数消耗了2毫秒。此时此刻,我想知道将其更改为异步方式的工作是否会为最终性能带来回报。
正如您可能知道的,node.js有一个并发模型,它只处理IO绑定任务的并发问题。任何未中断的串行任务都会在该时间段内暂停事件循环。可以实现例程来分解此任务,但它只适合特定的范式。如果你正在做一个需要大量时间的操作,那么你应该研究并行性。如果你正在逐行处理数据集,比如数组或文件,你可以实现一个递归函数来替换循环,当你递归而不是直接调用函数时,你可以用setTimeout
来延迟它,这样你就可以恢复你的事件循环,避免它停止太长时间(到发生超时的地方)。
我无法给出同步任务被认为"太长"的确切时间。这真的取决于情况。因素太多了。这项任务发生的频率真的很重要。
处理这类任务有多种方法:
- 分解一个串行任务。像我之前提到的那样,设置一个超时来分解事件循环中的部分任务。不过,如果你有足够的这些任务,它仍然会造成问题
- 考虑并行性。并行性对于从事件循环中删除串行任务来说并不是一个坏概念,但前提是该事件不经常发生。并行有很多开销
- 卸载给工人。将这些事件推送给一个工作人员或一组工作人员。这是非常常见的,唯一的缺点是操作成本略有增加(可能),如果你不小心,你可能会创建一些难以维护的东西(许多没有中央约定的小型系统)
- 排队和限制并发。如果任务很短,但很频繁,你可以简单地将它们排队,并确保一次只处理其中的几个,这样你的事件循环就不会被阻塞太长时间
如果你的进程需要2ms,那么让事件循环来处理它很可能会很好。阻止事件循环2ms并不是什么大不了的事。如果这些类型的任务很频繁(每秒多次),那么您可能需要考虑将其卸载给工作人员,或者可能创建某种队列或某种方法来限制一次处理的数量。否则,你可能会遇到反应缓慢的问题。现在我想你会没事的,除非这是一项非常普通的任务。
如果您的任务是IO绑定的,那么将其更改为异步的工作应该是微不足道的,因为nodejs是用这种范式从头开始构建的。如果在可能的情况下不使用异步方法,这是一种糟糕的做法。虽然这只和IO有关。如果您的任务不是从某个源读取/写入数据,那么异步方法将对您毫无帮助。
相关文章:
- 为什么我的上下文选择器和.buttonset()在ie中花费了这么长时间
- 谷歌地图需要很长时间才能在ie11中渲染
- 有没有一种方法可以检查javascript以毫秒为单位执行一个函数需要多长时间
- 我一直收到的控制台警告是什么?推迟长时间运行的计时器任务以提高滚动的流畅性
- 为什么这个代码不起作用?我花了很长时间试图弄清楚这一点
- Node.js中的垃圾收集作用域-变量将保持设置状态多长时间
- 将Parsley.js验证库附加到表单需要很长时间
- Node.js-同步操作中建议的最长时间
- JS-在长时间轮询成功时多次获得警报
- spin.js没有'它不会在长时间运行的任务中显示,但当我逐步通过调试器时会显示
- 散列CSS和JS文件长时间以相同的值加载,避免缓存是有意义的
- 如何验证多长时间的JS脚本在一个网站上运行
- 检测node.js http.接很长时间的电话
- spin.js在IE和FF上长时间运行线程时停止旋转
- 如果长时间没有返回响应,如何在node.js中强制请求函数终止
- 在ag-grid(纯JS)中处理长时间排序
- 当Node.js请求其他服务器的长时间http请求时,Node.js的正确行为是什么?
- 垃圾收集在我的JS实时应用程序中花费了太长时间
- node.js事件循环如何记住它需要在长时间运行的操作完成后回调?
- PhantomJS.Org 需要很长时间才能响应我的幻影 js 脚本