2010-09-28 52 views
14

我在node.js中寫了一個遊戲服務器,有些操作涉及服務器部分的繁重計算。我不想在運行這些計算時停止接受連接 - 當node.js不支持線程時,如何在後臺運行它們?node.js中的長時間運算

回答

13

我不能擔保其中的任何一個,但如果你在做進程中的工作,那麼已經有幾個獨立的WebWorkers API節點實現,如該節點模塊頁:

  • http://github.com/cramforce/node-worker
  • http://github.com/pgriess/node-webworker

乍一看,所述秒看起來更成熟了,這些都會讓你基本上做線程編程,但它基本上是演員模型,所以這一切都是ne與消息傳遞,你不能共享數據結構或任何東西。

另外,值得一提的是,node.js團隊打算最終實現原生API,所以即使這些工具不夠完美,也可能是一個體面的權宜之計。

+2

ryah建議node-webworker當我問他這個問題:) – nornagon 2010-10-08 03:04:09

+0

最近嘗試從http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html提到的這個問題 – BigbangO 2013-12-23 21:31:10

+0

處理這個問題的另一篇博文:http ://neilk.net/blog/2013/04/30/why-you-should-use-nodejs-for-CPU-bound-tasks/ – loveNoHate 2014-02-20 13:12:11

1

,有些操作涉及在服務器

你是怎麼寫的代碼,是擺在首位的計算重的部分重 計算。這在node.js中很難做到。

我怎麼可以運行它們在後臺 node.js的時候不支持多線程

你可以產卵了幾個工人(節點)的實例,並接受連接進行通信(節點實例)使用例如redis阻止彈出窗口。 Node.js redis庫沒有阻塞。

+0

這並不難。我正在循環播放128x128x128 = 200萬塊或更大的遊戲地圖並計算內容。 – nornagon 2010-09-28 02:21:21

+0

...或任何類型的圖像處理。 – nornagon 2010-09-28 02:38:26

+0

這種方法應該可行。你應該通過消息傳遞做一些分而治之(阻塞列表操作)。 – Alfred 2010-09-28 06:38:17

4
var spawn = require('child_process').spawn; 
listorwhatev = spawn('ls', ['-lh', '/usr']);//or whatever server action you need 

//then you can attach events to that list like this 
listorwhatev.on('exit', function(code){}); 

///or in this ls example as it streams info 
listorwhatev.stdout.on('data', function(info){sys.puts(info);}); 

確保每個應用程序都會產生一次spawn過程,然後將其饋入其中,並觀察每個連接的事件。 在處理它之前,您還應該檢查listorwhatev是否仍在運行。因爲我們都喜歡節點崩潰應用程序中的那些未被捕獲的錯誤,所以我們不會;) 當通過殺死或者在您的機器上發生了不好的事情而退出了spawn(pid)並且您沒有優雅地退出代碼中的spawn時,您的流事件處理程序會使應用程序崩潰。

+0

我會傳遞幾兆字節的數據;標準輸出/標準輸入不真正感覺最佳... – nornagon 2010-10-08 03:03:00