0

ほとんどのサーバー側スクリプト言語には exec 関数 ( nodephpruby​​ など) があります。これにより、プログラミング言語がシェルと対話できるようになります。

exec()node.js で使用して、ブラウザで AJAX リクエストを処理していた大規模なプロセスを実行したいと考えています。ユーザーに進行状況を表示するための単純な進行状況/読み込みバーが必要です。

exec以下の例では、関数のコールバック/非同期の性質により、この例の読み込みに 5 秒以上かかることがわかりました。

私が欲しいのは、ロードバーのような実行の現在の状態でブラウザのコンテンツを更新(ajax)する方法です。しかし、実行されたファイルがブラウザに依存することは望ましくありません。

何か案が?

私のルート

exports.exec = function(req,res){
  // http://nodejs.org/api.html#_child_processes
  var sys = require('sys')
  var exec = require('child_process').exec;
  var child;
  child = exec("node exec/test.js", function (error, stdout, stderr) {
    var o = {
      "error":error,
      "stdout":stdout,
      "stderr":stderr,
    };
    o = JSON.stringify(o);
    res.send(o);
  });
};

私のtest.jsファイル

var sys = require('sys');

var count = 0;

var interval = setInterval(
    function(){
        sys.print('hello'+count);
        count++

        if(count == 5){
            clearInterval(interval);
        }

    },
1000);
4

1 に答える 1

6

これにはsocket.ioを使用する必要があります。これは、socket.io を使い始めるためのデモ アプリです。

socket.io を使用して 1% ごとにイベントを発行すると、ブラウザーはそれをリッスンしてバーを更新します。

ストリーム出力が必要な exec は使用できません。したがって、むしろchild_process
を使用したいと思います。

サーバー上。

var spawn = require('child_process').spawn,
    exec  = spawn('node exec/test.js');

exec.stdout.on('data', function (message) {
  socket.emit('process', message);
});

サブプロセス:

console.log('10%')
// ...
console.log('20%')
// ...
console.log('30%')

サブプロセスがノード スクリプトである場合は、より洗練された処理を実行できます。ストリーム stdout と対話する必要はなく、ノードのクラスターモジュールを使用して、マスター プロセスとスレーブ プロセス間でメッセージを送信できます。

これを実現する方法を示すルート /exec を追加して、前のデモ アプリのフォークを作成しました。

時間ができたら別のデモ アプリを作成しますが、これは非常に興味深く、教育的なテストです。アイデアをありがとう:D.

于 2012-08-24T02:41:51.730 に答える