Windows Azureプロジェクトのnode.jsにsocket.ioを実装しています。接続されているすべてのクライアントに定期的にデータを送信する必要があります。
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
}
基本的に、requestQueueメソッドは、接続されたクライアントに特定の間隔でデータを送信するスレッドのように継続的に実行する必要があります。また、クライアントが「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);
}
他の人が示唆しているように、setInterval
またはsetTimeout
関数を使用して、接続されたクライアントに定期的にデータを送信することで、これを実現できます。すべてが同じ制御スレッド内で実行されますが、すべてのI/Oは非同期で行われるため、アプリケーションは引き続き応答します。 IE、タイマーの実行中に受信したデータは、タイマー機能が戻った後にキューに入れられて処理されます。
詳細については、node.jsマニュアルの Timers を参照してください。
余談ですが、node.jsアプリケーションは非同期I/Oをほぼリアルタイムで処理することに重点を置く必要があります。それがnode.jsの強みだからです。重い計算を行う必要がある場合は、結果の非同期リクエストを作成するだけで、なんらかの方法でそれを別のスレッド/プロセスにオフロードできます。
そうです、ノードはシングルスレッドです。しかし、それはイベントを多用します。
必要な戦略は、接続でイベントをリッスンし、データを取得することです。また、データを送り返したい場合は、別のイベントが発生したのでそれを行います。
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>
スレッドを実行するためのNode.jsライブラリもあります:node-webworker-threads
https://github.com/audreyt/node-webworker-threads
これは基本的に、node.js用の Web Worker browser API を実装します。
これは、node.jsのシングルスレッド化の哲学と一致していませんが、必要に応じて存在します。
Node.jsのマルチスレッド?
はい..npmモジュール 'Java4node'を使用してnodejsで可能です。このパッケージのメソッドは.multiThreading(tasks、callbacks)です。この関数は、Javaスクリプト形式でマルチスレッドを実行するために使用されます
このモジュールリンクを使用する場合: https://www.npmjs.com/package/Java4node
称賛する
npm install 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)
});
SetIntervalなどで定義したロジックは、別のスレッドでは機能せず、最終的にメインをブロックします。 1000人のユーザーがいて、setTimeoutなどを1000回呼び出したとしましょう。最終的には実行され、その貴重な時間を費やします。最後のIO操作のみがブロックされません!
Node.jsのマルチスレッドについて nodeJX を調査することを検討してください