2014-05-13 41 views
1

我正在嘗試學習Node.js,它既用於web應用程序開發,也用於小型系統腳本。使用Python,我們有這個庫gevent實現了greenlets和monkey patch Python STD庫,所以你可以編寫同步代碼,它可以像async那樣工作。什麼是Python的gevent的Node.js等價物?

有沒有類似的東西,但對於節點?我已閱讀了異步和Fibers,但我不明白這是否是一種類似的方法。

+1

nodejs在設計和默認情況下是異步的。因此無需修補任何內容,因爲所有庫都是使用async編程編寫的。沒有需要修補的同步庫。您必須編寫異步代碼。 – mpm

+0

nodejs/javascript是由設計回調。問題是關於一種從回調設計到異步設計的技術,從python到twisted到gevent。 – Alex

回答

0

從查看gevent文檔中的第一個示例,您正在尋找generators,這是一項尖端功能。您可以通過在支持節點版本中傳遞--harmony_generators來使用它們(當前不穩定的0.11)。

使用本地生成器並不難,但我建議co module。從它的自述一個例子:

co(function *(){ 
    var a = get('http://google.com'); // an async process 
    var b = get('http://yahoo.com'); // an async process 
    var c = get('http://cloudup.com'); // an async process 
    var res = yield [a, b, c];   // wait until these are done in a 
            // synchronous style. 
    console.log(res);     // log these objects 
})() 

其他更傳統的選擇將是使用許諾(多個庫存在):

doSomeTaskThatReturnsAPromise() 
    .then(somethingElse) 
    .then(somethingElse) 
    .then(function() { console.log("I'm done!") }); 

..或者庫如async

async.series([ 
    doSomeTask, 
    somethingElse, 
    somethingElse 
], function() { 
    console.log("I'm done!"); 
}); 

我對Fibers沒有經驗,但我相信它在概念上與Generators相似。

+0

Gevent不使用生成器 - 它使用了執行python stack save/restore的greenlet模塊來獲得協程。這與蟒蛇生成器不同 - 不涉及收益。 – Alex

+0

這是使用生成器的解決方案示例:https://mail.python.org/pipermail/python-announce-list/2007-June/005908.html。注意每處的yield關鍵字。 Gevent使用greenlet修復了這個問題。 – Alex

相關問題