2012-04-06 88 views
5

我想添加一些管理實用程序到一個小的Web應用程序,如「備份數據庫」。用戶將點擊一個按鈕,HTTP響應將立即返回,儘管可能長時間運行的進程已在後臺啓動。node.js中的「產生線程」式行爲

在Java中,這可能會通過使用Actor在Scala中產生一個獨立的線程來實現。但是,node.js中的適當成語是什麼? (代碼段讚賞)

我現在正在重新閱讀文檔,這確實看起來是一個節點101的問題,但這幾乎是我在這上面...無論如何,澄清這是基本情況:

function onRequest(request, response) { 
    doSomething(); 
    response.writeHead(202, headers); 
    response.end("doing something"); 
} 

function doSomething(){ 
    // long-running operation 
} 

我想讓響應立即返回,並使doSomething()在後臺運行。

好吧,給定節點的單線程模型,如果不產生另一個OS級別的ChildProcess,看起來不可能。我的誤解。

在我的代碼中,我需要的備份大多是基於I/O的,所以節點應該以很好的異步方式處理它。我想我會做的是將doSomething轉移到response.end之後,看看它是如何表現的。

+0

我相信你瀏覽過文檔。 http://nodejs.org/docs/v0.4.7/api/index.html我認爲這取決於你的過程的性質,但看看兒童進程。 – supertopi 2012-04-06 11:36:57

+0

謝謝。看起來我的問題根源在於對node如何工作的深刻誤解:) Child Process是我的想法,雖然不是最簡單的解決方案,請參閱下面的Joe的回覆。 – danja 2015-08-14 18:05:17

回答

3

我看不到問題。您只需要doSomething()即可啓動異步操作。它會立即返回,您的onRequest將寫回響應,並且客戶端將獲得他們的「確定,我開始」的消息。

function doSomething() { 
    openDatabaseConnection(connectionString, function(conn) { 
     // This is called some time later, once the connection is established. 
     // Now you can tell the database to back itself up. 
    }); 
} 

doSomething不會只是坐在那裏,直到該數據庫建立連接,或等待你告訴它備份。它會立即返回,並註冊一個稍後運行的回調。在幕後,你的數據庫庫可能爲你創建了一些線程,使異步工作按照它的方式工作,但是你的代碼不需要擔心;您只需立即返回,立即將響應發送給客戶端,異步代碼將保持異步運行。

(它實際上更多的工作,以使這個同步運行 - 你有你的response對象傳遞到doSomething,並有doSomething做最裏面的回調裏面response.end呼叫時,備份完成後,當然,這不是你想在這裏做什麼;你想立即返回,這正是你的代碼將做的。)

+0

謝謝。看來我的問題根源在於對節點如何工作的深刻誤解:) – danja 2015-08-14 18:02:34

5

supertopi說你可以看看Child process。但是我認爲這會損害服務器的性能,如果這種情況連續發生的話。那麼我認爲你應該排隊他們。我想你應該看看asynchronous message queues離線處理你的工作(分佈式)。消息隊列的一些(僅舉兩個例子)是beanstalkdgearman

+0

謝謝。看起來我的問題源於對節點如何工作的深刻誤解:)雖然使用隊列似乎是一個非常好的主意。 – danja 2015-08-14 18:02:11