Node.js 后台进程,加载条

Node.js 后台进程,加载条,node.js,Node.js,大多数服务器端脚本语言都有exec函数(、等)。这允许编程语言与shell交互 我希望使用node.js中的exec()来运行大型进程,这是我在浏览器中处理AJAX请求时经常做的事情。我想要一个简单的进度/加载栏来向用户显示进度 我在下面的示例中发现了一个困难的方法,exec函数的回调/异步特性将使这个示例的加载时间超过5秒 我想要的是用某种方式让浏览器的内容更新(ajax)到当前的执行状态,就像加载条一样。但我不希望运行的文件依赖于浏览器 有什么想法吗 我的路线 exports.exec =

大多数服务器端脚本语言都有exec函数(、等)。这允许编程语言与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);
你应该用这个。 下面是一个让您开始使用socket.io的示例

如果使用socket.io为每1%发出一个事件,浏览器将侦听该事件并更新一个条

您不能使用exec,因为您需要流式输出。
所以你宁愿用

在服务器上

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%')
如果您的子进程是一个节点脚本,那么您可以做一些更加优雅的事情。 您可以使用node模块在主进程和从进程之间发送消息,而不必与流stdout通信

我对上一个演示应用程序添加了一个route/exec,演示了如何实现这一点

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

你应该用这个。 下面是一个让您开始使用socket.io的示例

如果使用socket.io为每1%发出一个事件,浏览器将侦听该事件并更新一个条

您不能使用exec,因为您需要流式输出。
所以你宁愿用

在服务器上

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%')
如果您的子进程是一个节点脚本,那么您可以做一些更加优雅的事情。 您可以使用node模块在主进程和从进程之间发送消息,而不必与流stdout通信

我对上一个演示应用程序添加了一个route/exec,演示了如何实现这一点


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

谢谢,我现在就开始演示,深入socket.io文档。我很难相信还没有人这么做。是否可以用其他语言表达?node.js和socket.io最适合这样做吗?@ThomasReggi:你可以在每种有websocket实现的语言/平台上这样做。做一些工作,发射和事件。做更多的工作,提交另一个事件。。。在每个任务中,您都可以通过处理状态。感谢您进一步完善您的答案。这太棒了。我很欣赏包括express3和socket.io在内的repo。我有点搞不懂你是如何设置
exec.on
。我几乎听不懂医生的话<代码>'ipc'-创建ipc通道,用于在父级和子级之间传递消息/文件描述符。一个子进程最多可以有一个IPC标准文件描述符。设置此选项将启用ChildProcess.send()方法。如果子进程将JSON消息写入此文件描述符,则将触发ChildProcess.on('message')。如果子项是Node.js程序,则IPC通道的存在将启用process.send()和process.on('message')。我给出了一个简单的示例。克隆这个fork/exec和瞧。谢谢,我现在就开始演示,深入socket.io文档。我很难相信还没有人这么做。是否可以用其他语言表达?node.js和socket.io最适合这样做吗?@ThomasReggi:你可以在每种有websocket实现的语言/平台上这样做。做一些工作,发射和事件。做更多的工作,提交另一个事件。。。在每个任务中,您都可以通过处理状态。感谢您进一步完善您的答案。这太棒了。我很欣赏包括express3和socket.io在内的repo。我有点搞不懂你是如何设置
exec.on
。我几乎听不懂医生的话<代码>'ipc'-创建ipc通道,用于在父级和子级之间传递消息/文件描述符。一个子进程最多可以有一个IPC标准文件描述符。设置此选项将启用ChildProcess.send()方法。如果子进程将JSON消息写入此文件描述符,则将触发ChildProcess.on('message')。如果子项是Node.js程序,则IPC通道的存在将启用process.send()和process.on('message')。我给出了一个简单的示例。克隆这个fork/exec,瞧。