web-dev-qa-db-ja.com

Node.jsのマルチスレッド?

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);
}
11
Bitsian

他の人が示唆しているように、setIntervalまたはsetTimeout関数を使用して、接続されたクライアントに定期的にデータを送信することで、これを実現できます。すべてが同じ制御スレッド内で実行されますが、すべてのI/Oは非同期で行われるため、アプリケーションは引き続き応答します。 IE、タイマーの実行中に受信したデータは、タイマー機能が戻った後にキューに入れられて処理されます。

詳細については、node.jsマニュアルの Timers を参照してください。


余談ですが、node.jsアプリケーションは非同期I/Oをほぼリアルタイムで処理することに重点を置く必要があります。それがnode.jsの強みだからです。重い計算を行う必要がある場合は、結果の非同期リクエストを作成するだけで、なんらかの方法でそれを別のスレッド/プロセスにオフロードできます。

11
Justin Ethier

そうです、ノードはシングルスレッドです。しかし、それはイベントを多用します。

必要な戦略は、接続でイベントをリッスンし、データを取得することです。また、データを送り返したい場合は、別のイベントが発生したのでそれを行います。

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>
11
ExxKA

スレッドを実行するためのNode.jsライブラリもあります:node-webworker-threads

https://github.com/audreyt/node-webworker-threads

これは基本的に、node.js用の Web Worker browser API を実装します。

これは、node.jsのシングルスレッド化の哲学と一致していませんが、必要に応じて存在します。

3
Shawn Vincent

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)
       });
0
ngCourse

SetIntervalなどで定義したロジックは、別のスレッドでは機能せず、最終的にメインをブロックします。 1000人のユーザーがいて、setTimeoutなどを1000回呼び出したとしましょう。最終的には実行され、その貴重な時間を費やします。最後のIO操作のみがブロックされません!

Node.jsのマルチスレッドについて nodeJX ​​を調査することを検討してください

0
Nuray Altin