簡體   English   中英

Node.js的同步代碼與異步代碼

[英]Synchronous vs Asynchronous code with Node.js

我們正在使用node,主要用於內部項目並了解使用該技術的最佳方式。

不是來自特定的異步背景,學習曲線可能是一個挑戰,但我們已經習慣了框架並學習了這個過程。

讓我們兩極分化的一件事是,使用同步代碼與異步代碼的最佳時間是。 我們當前正在使用規則,如果有任何事情與IO交互,那么它必須通過回調或事件發射器(即給定的)是異步的,但是其他不以任何方式使用IO的項可以構造為同步函數(這還取決於函數本身的重量以及它實際上是如何阻塞的)但這是使用Node.js時最好的方法嗎?

例如,我們正在創建一個Hal + JSON構建器,它當前存在於我們的代碼庫中。 它是同步的,因為它所做的只是創建一些相當小的對象文字,僅此而已,沒有外部依賴,當然也沒有IO交互。

我們的方法是否適合采取?

假設你有兩個函數, foobar ,它們是同步執行的:

function foo() {
    var returnValue = bar();
    console.log(returnValue);
}

function bar() {
    return "bar";
}

為了使API“異步”是將其更改為使用回調:

function foo() {
    bar(function(returnValue) {
        console.log(returnValue);
    });
}

function bar(callback) {
    callback("bar");
}

但事實是,這段代碼仍然是完全同步的。 回調正在同一個調用堆棧上執行,並且沒有進行線程優化,也沒有可伸縮性的好處。

然后它成為代碼可讀性和編碼風格的問題。 我個人發現典型的var val = func(); 類型代碼更易讀,易於理解。 唯一的缺點是,如果你有一天需要更改bar的功能,那么它需要執行一些I / O活動或調用其他異步函數,你需要更改bar的API 。

個人的偏好:適用時使用傳統的,混合模式。 在涉及I / O或有疑問時,始終使用異步樣式。

使用process.nextTick()將同步函數轉換為異步函數是一個選項,但只有在軟件阻塞時間過長的情況下才能使用。 每次你的同步函數運行時節點都不能做任何其他事情,因為它是單線程的。 這意味着如果您的應用程序是服務器,它將變得無響應。

在拆分任何同步功能之前,我建議先做一些基准測試和分析,這樣你就可以做出明智的決定。 否則你會冒着過早優化的風險

請參閱此處以獲得良好的討論https://softwareengineering.stackexchange.com/questions/80084/is-premature-optimization-really-the-root-of-all-evil

以下是如何使您的函數異步,從某種意義上說,您將允許節點執行其他操作http://howtonode.org/understanding-process-next-tick

我不是什么“Hal + Json builder”,但這就是我對NodeJS的看法。 您應該盡可能地將代碼編寫為異步,將其推向極限。 簡單的原因是異步代碼交換響應性能,這在大多數情況下更重要。

當然,如果某些操作非常快,那么就不需要異步代碼。 例如,考慮以下代碼:

var arr = []; // assume array is nonempty
for (var i = 0, l = arr.length; i < l; i++) {
    arr[ i ].doStuff( );
}

如果arr很小並且doStuff是一個快速操作,那么你不應該以異步方式編寫這段代碼。 但是如果需要一些時間,那么你應該考慮這樣寫:

var arr = []; // assume array is nonempty
var process_array_element = function( ) {
    if (arr.length) {
        arr.pop().doStuff( );
        process.nextTick( process_array_element );
    }
};
process_array_element( );

現在這段代碼真的是異步的。 完成這項工作需要更多的時間,但與此同時它不會阻止整個服務器。 我們交易了響應性能。

結論:這取決於你的情況! :)

暫無
暫無

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

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