同步插件将阻止Node.js的事件循环。但也许,存在阻止事件循环的“标准”限制。
var results = addon.my_function(parameters); //consumes 2ms
我的功能耗时2毫秒。此刻,我想知道将其改为异步方式的工作是否能够带来最终的表现。
答案 0 :(得分:3)
您可能知道node.js有一个并发模型,它只能解决IO绑定任务的并发性问题。任何未分解的串行任务都会暂停该持续时间的事件循环。可以实现例程来打破这个任务,但它只包含特定的范例。如果您正在进行一项需要花费大量时间的操作,那么您应该研究并行性。如果你正在处理一个数据集,比如一个数组或一个文件,你可以实现一个递归函数来替换一个循环,当你递归而不是直接调用你的函数时你可以用setTimeout
来延迟它。你可以恢复你的eventloop以避免停止太长时间(发生超时)。
我无法确切地告诉您同步任务被认为“太长”的确切时间。这真的取决于。有太多因素。这项任务发生的频率确实有所不同。
处理这些任务有多种方法:
如果你的进程花费了2ms,那么你可能只是让事件循环处理它就好了。阻止事件循环2ms并不是什么大问题。如果这些类型的任务频繁(每秒多次),那么您可能需要考虑卸载到工作者或可能创建某种队列或某种方法来限制一次处理的数量。否则你可能会遇到响应缓慢的问题。现在我认为除非这是一项非常普遍的任务,否则你会没事的。
如果您的任务是IO绑定的,那么将其更改为异步的工作应该是微不足道的,因为nodejs是从这个范例开始构建的。如果您不尽可能不使用异步方法,这是不好的做法。虽然这只与IO有关。如果你的任务不是从某个源读取/写入数据,那么异步方法对你来说绝对没有任何作用。