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