13

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);
}
4

5 に答える 5

13

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

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


余談ですが、node.js の強みであるほぼリアルタイムでの非同期 I/O の処理に、node.js アプリケーションを集中させたいと思うでしょう。重い計算を行う必要がある場合は、結果に対して非同期要求を行うだけで、何らかの方法でそれを別のスレッド/プロセスにオフロードする必要があります。

于 2013-03-20T17:29:29.237 に答える
12

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

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

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>
于 2013-03-19T13:13:23.893 に答える
3

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

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

これは基本的に、node.js 用のWeb Worker ブラウザー APIを実装します。

これは node.js のシングル スレッド化の哲学と一致しないことに注意してください。

于 2014-03-23T16:58:05.387 に答える
1

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)
       });
于 2017-09-18T03:17:32.963 に答える