簡體   English   中英

Node.js async forEach:線程安全嗎?

[英]Node.js async forEach: thread-safe?

我有一個(也許是微不足道的)問題。 我正在使用Node.js包async ,尤其是async.each方法( https://github.com/caolan/async#forEach )。

考慮以下代碼:

var arrayOne=[];

async.forEach(arrayTwo, 
  function (item, callback){ 
    arrayOne.push(item); // push into arrayOne
    callback(); // the iterator has completed
  }, function(err) {
   // do something with arrayOne
}); 

arrayOne.push(item)安全嗎?

因此,這里的答案有些微妙。 對於這種確切的情況,您將得到arrayOne具有與arrayOne相同順序的相同項目的arrayTwo ,但這更多是示例代碼沒有真正異步和異步的async.forEach不會做任何過於意外/明智的事情。 但是,要使其真正可靠,您需要使用一個保證順序的async函數,而.forEach/.each合同的.forEach/.each不這樣做。 .each僅保證對arrayTwo每個項目都調用一次worker函數。 它不能保證它將按順序啟動它們,或者等到它們完成之后再啟動下一個,等等。如果異步的作者決定以相反的順序啟動工作器函數以進行一些性能優化,例如,那將會改變你的副作用。 因此,最好不要依賴除異步功能的定義/文檔中明確保證之外的任何行為。 因此,使用async.series類的async.series將為您提供一種可靠的方式來執行此arrayOne ,並且最終不會在arrayOne中獲得意外的順序。 當然,並行性特征現在已經大不相同。

但是,從技術上講,這並不涉及“線程安全性”的概念,因為節點只有一個執行線程。 但是,在處理這樣的異步代碼時,您最終會考慮相同類型的競爭條件,因此最終,就像在多線程語言中一樣,您可以在節點中編碼競爭條件。

我要記住的最有用的類比是異步代碼是按交付點菜。 如果您致電3家餐廳並從每家餐廳訂購一個比薩餅,這並不意味着送貨到達您家的順序。

暫無
暫無

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

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