簡體   English   中英

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來延遲它,這樣你就可以恢復了你的eventloop,以避免停止太長時間(發生超時)。

我不能給你一個確定的時間,同步任務將被視為“太長”。 這真的取決於。 有太多因素。 這項任務發生的頻率確實有所不同。

處理這些任務有多種方法:

  1. 打破一個連續任務。 設置超時以分解事件循環中的任務部分,就像我之前提到的那樣。 雖然如果你有足夠的這些任務,它仍然可能會導致問題。
  2. 考慮並行性。 並行性對於從事件循環中刪除串行任務並不是一個壞概念,但前提是該事件不會經常發生。 並行性有很多開銷。
  3. 卸載給工人。 將這些事件推送給一個工人或一組工人。 這是非常常見的,唯一的缺點是運營成本略有增加(可能),如果你不小心,你可以創造一些難以維護的東西(很多沒有中心慣例的小系統)。
  4. 排隊和限制並發。 如果任務很短,但很頻繁,您可以簡單地將它們排隊,並確保一次只處理其中一些,以便您的eventloop不會被阻止太長時間。

如果你的進程花費了2ms,那么你可能只是讓事件循環處理它。 阻止事件循環2ms並不是什么大問題。 如果這些類型的任務頻繁(每秒多次),那么您可能需要考慮卸載到工作者或可能創建某種隊列或某種方法來限制一次處理的數量。 否則你可能會遇到響應緩慢的問題。 現在我認為除非這是一項非常常見的任務,否則你會沒事的。

如果您的任務是IO綁定的,那么將其更改為異步的工作應該是微不足道的,因為nodejs是從這個范例開始構建的。 如果您不盡可能不使用異步方法,這是不好的做法。 雖然這只與IO有關。 如果您的任務不是從某個源讀取/寫入數據,那么異步方法對您來說絕對沒有任何作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM