后台进程,加载栏

时间:2012-08-24 02:39:53

标签: node.js

大多数服务器端脚本语言都有exec函数(nodephpruby等)。这允许编程语言与shell交互。

我希望在node.js中使用exec()来运行大型进程,这是我以前在浏览器中对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);

1 个答案:

答案 0 :(得分:6)

您应该使用socket.io。 这是一个demo app,可以帮助您开始使用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%')

如果您的子流程是一个节点脚本,您可以做一些更优雅的事情。 您可以使用节点的cluster模块在​​主进程和从进程之间发送消息,而不必与流标准进行通信。

我在之前的演示应用程序中添加了fork,添加了一个路由/执行文件,演示如何实现此目的。

当我有更多时间制作另一个演示应用程序时,这是一个非常有趣且有教育意义的测试。谢谢你的想法:D。