2013-05-26 30 views
1

當我在服務器端收到一個「on」事件時,我想並行地啓動一個任務,所以它不會阻塞當前的事件循環線程。是否有可能這樣做?怎麼樣?如何使用socket.io和node.js執行異步任務?

我不想阻止服務器端循環,我希望能夠發回信息給客戶端,一旦任務完成,一些諸如:

client.on('execute-parallel-task', function(msg) { 
    setTimeout(function() { 
     // do something that takes a while 
     client.emit('finished-that-task'); 
    },0); 
    // this block should return asap, not waiting for the previous call 
}); 

我不知道如果setTimeout將完成這項工作。

回答

1

你不需要setTimeout。 執行並行任務完成後,將調用您的函數(msg)。

,如果你正在設計以異步方式運行任務,你可以看看像異步lib中的node.js

Async Node JS Link

+0

我可以使用async.parallel沒有問題,但服務器將回答其他請求,而我的(做一些需要一段時間)正在運行?它會同時運行兩個代碼嗎? –

+0

是的,這就是異步的工作方式......它基本上是一個線程(你在node.js中沒有線程)......每當有一部分正在等待發生的事情時,其他代碼就會運行,並且當發生事件時會調用一個事件正確的處理程序處理它.. http://stevehanov.ca/blog/index.php?id=12 –

+0

如果你需要線程模型,你可能已經選擇了worng技術爲你的後端...有多個進程之間進行溝通不像線程那樣高效..事實上,你會創建使用進程的線程==更高的開銷,更多的複雜性,沒有支付.. –

2

這取決於什麼需要一段時間是。如果需要異步處理(因爲必須註冊回調函數或complete處理程序),而需要一段時間,因爲它被阻塞在IO之類的東西上,而不是CPU綁定,它本質上會成爲平行

但是,如果它的東西同步或CPU的約束,而你可以使用setTimeoutsetImmediate等立即發回的消息,一旦處理程序setTimeoutsetImmediate執行,你執行一個線程將被固定在處理那些;你不是真的修復的問題,只是推遲它。

要展現真實的並行行爲,您需要啓動child process。您可以使用消息傳遞功能來通知您的工作人員做什麼工作,並在工作完成後通知父進程。

var cp = require('child_process'); 
var child = cp.fork(__dirname + '/my-child-worker.js'); 

n.on('message', function(m) { 
    if (m === "done") { 
     // Whey! 
    } 
}); 

n.send(/* Job id, or something */); 

然後在my-child-worker.js;

process.on('message', function (m) { 
    switch (m) { 
     case 'get-x': 
      // blah 
     break; 
     // other jobs 
    } 

    process.send('done'); 
}); 
+0

子進程看起來很完美,但我應該運行一個bash進程,而我只是想運行一個javascript函數。整個node.js運行模型是單線程的,所以如果拋棄新進程,我只能運行兩個線程? –

+0

每個子進程都有自己的線程,與父進程的線程分開。這給你並行執行。這是否回答你的問題......我完全不瞭解你的意見! – Matt

+0

所以你使用node.js創建進程,使用ipc來模擬node.js中的線程?用線程支持的服務器代替它會更好嗎? –