2013-03-19 53 views
11

我在node.js中爲Windows Azure項目實現socket.io。我必須定期向所有連接的客戶端發送數據。Node.js中的多線程?

我是新來的node.js,但我想多線程是不可能的。 socket.io的目的是爲了支持實時應用程序,所以有什麼方法可以將數據連續不斷地發送給所有連接的客戶端,並同時處理客戶端同時發送到socket.io服務器的任何數據?

編輯:

這大約是我socket.io實施

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    socket.emit('first', "connected"); 

    socket.on('clientData', function (data) { 
    //processing the data 
    }); 
}); 

function requestQueue() { 
// some processing 
io.sockets.emit('broadcast', recordsQueue); 
// should go to sleep for a time period 
} 

基本上我想要的請求隊列方法,不斷就像一個線程,這會在特定的時間間隔發射數據連接的客戶端運行。而且,如果客戶端發送任何數據到「clientData」事件,那麼我應該能夠接收數據並處理它。

任何想法,我怎麼能做到這一點?

感謝

我的解決辦法:

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    socket.emit('first', "connected"); 

    socket.on('clientData', function (data) { 
    //processing the data 
    }); 
}); 

function requestQueue() { 
var sleepTime = 0; 

// calcuate sleepTime 

io.sockets.emit('broadcast', recordsQueue); 

// should go to sleep for a time period 
    if(sleepTime !=0) 
    setTimeout(function() { requestQueue() }, sleepTime); 
} 

回答

10

正如其他人的建議,你可以通過使用setIntervalsetTimeout功能定期發出的數據連接的客戶端實現這一目標。雖然所有內容都在同一控制線程中運行,但所有I/O都是異步完成的,因此您的應用程序仍可以進行響應。 IE中,定時器運行時接收到的任何數據將在定時器函數返回後排隊並處理。請參閱以瞭解更多信息。


在一個側面說明,你會希望有您的Node.js應用程式專注於近實時的處理異步I/O,因爲這是node.js中的力量如果您需要執行任何繁重的計算,那麼您只需要簡單地對結果進行異步請求即可將其卸載到另一個線程/進程中。

+0

謝謝大家的答案! setInterval已經解決了我的問題,但是,我的requestQueue方法做了一些繁重的計算,並且擔心客戶端發出的socket.io請求的性能會受到它的影響。如果你可以在你的附註中詳細說明一下,或許可以使用代碼片段或可能的鏈接,我會非常感激。非常感謝! – Bitsian 2013-03-21 07:32:46

+0

好吧,對於單線程應用程序或只有一個線程專用於特定任務的應用程序,這是一個反覆出現的問題。例如,Windows前端應用程序只能有一個UI線程,所以必須非常小心,以確保將任何長時間運行的計算卸載到不同的線程/進程/等,以避免中斷主GUI消息泵。節點有一個類似的約束,它只有一個執行線程,儘管可以有很多非阻塞I/O,因爲這個工作獨立於執行線程而發生。 – 2013-03-21 14:43:01

+0

下面是一個SO質疑有關長期運行在節點的計算,可以幫助:http://stackoverflow.com/questions/3809165/long-running-computations-in-node-js – 2013-03-21 14:45:02

11

你是對的,節點是單線程的。但它大量使用事件。

您應該採取的策略是監聽連接上的事件,檢索數據,以及何時想要發回數據時,請執行此操作,因爲已發出其他事件。

如果您看看socket.io首頁上的示例,您將看到他們如何使用事件來開始處理流。 on(eventName,function)方法是您如何監聽NodeJS中的事件。

如果您希望根據時間進行操作(通常是一個糟糕的主意),請查看setInterval方法。

服務器

var io = require('socket.io').listen(80); 

    io.sockets.on('connection', function (socket) { 
     socket.emit('news', { hello: 'world' }); 
     socket.on('my other event', function (data) { 
     console.log(data); 
     }); 
    }); 

客戶

<script src="/socket.io/socket.io.js"></script> 
    <script> 
     var socket = io.connect('http://localhost'); 
     socket.on('news', function (data) { 
     console.log(data); 
     socket.emit('my other event', { my: 'data' }); 
     }); 
    </script> 
+0

我不知道,如果你有我的問題正確。我的錯誤,我沒有正確的框架之前。我已經更新了該問題,請告訴我,如果您有任何想法? – Bitsian 2013-03-19 13:46:48

+0

你看過setInterval方法嗎? – ExxKA 2013-03-19 15:04:10

+0

感謝您的setInterval :) Upvoting – Bitsian 2013-03-21 07:39:06

0

您在setInterval中定義的邏輯等將不會在單獨的線程中工作,並最終阻止主線程。假設有1000個用戶,並且您將setTimeout等稱爲1000次,最終它們將運行並花費那麼寶貴的時間。只有最後的IO操作是無阻塞的!

您可以考慮在多線程的Node.js調查nodeJX

0

在Node.js的多線程?

是..它能夠在使用NPM模塊「java4node」,它的NodeJS這種封裝的方法是 .multiThreading(任務,回調) 該功能是使用用於執行Java腳本方式

爲多線程使用此模塊 鏈接:https://www.npmjs.com/package/java4node

運行讚揚

NPM安裝java4node

var java = require('java4node') 

java.multiThreading({ 
      one: function(callback,parameters) { 
       console.log("function one is running independently"); 
       callback() 
      }, 
      two: function(callback,parameters) { 
       console.log("function two is running independently"); 
       callback() 
      }, 
      three: function(callback,parameters) { 
       console.log("function three is running independently"); 
       callback() 
      } 
     }, function(err, results) { 
      callback(err, results) 
     });