我如何并行执行多个nodejs进程

时间:2014-04-07 22:23:44

标签: node.js

我正在使用nodejs捕获视频流,然后使用spawn调用ffmpeg来处理feed。如果我收到多个视频流,我想并行执行此操作。

我可以通过打开多个终端并使用ffmpeg命令的不同变体来手动模拟它来执行这些过程。

我认为nodejs是单线程的,我已经审查了异步,但没有弄清楚这可能是如何应用的,因为回调起着不可或缺的作用。

基本上我想并行调用多个ffmpeg进程而不打开多个终端窗口并处理错误或退出等回调。

e.g。

//spawn ffmpeg with params
var ffmpegexec = spawn('ffmpeg', ['-i', 'pathname', '-vcodec', 'libx264', '-acodec', 'libfdk_aac', '-threads', '2', '-s', '320x240', 'filename.mp4');

//deal with output
ffmpegexec.stdout.on('data', function(data) {
    console.log("stdout: " + data);
});

ffmpegexec.stderr.on('data', function(data) {
    console.log("stderr : " + data);
});

ffmpegexec.on('exit', function(code) {

    console.log("exit: " + code);
});

我在想,也许我可以在一个单独的nodejs实例中启动每个新进程,或者不依赖于你的建议

2 个答案:

答案 0 :(得分:2)

连续多次拨打spawn(...)

每次调用process.spawn(...)都会启动一个新的操作系统进程,其中很多可以同时运行。 必须为每个实例注册单独的stdout / stderr / exit处理程序,但如果它们相似,则可以使用相同(或类似)的处理程序。

例如,如果要在单独的文件名上运行相同的命令,可以执行以下操作:

function runFfmpeg(filename) {
  var proc = process.spawn('ffmpeg', ['-i', 'pathname', ..., filename]);
  proc.stdout.on('data', function(data) { console.log("stdout: " + data); });
  proc.stderr.on('data', function(data) { console.log("stderr: " + data); });
  proc.on('exit', function(code) { console.log("exit: " + code); });
}

var filenames = ['foo.mp4', 'bar.mp4', 'gah.mp4'];
filenames.forEach(function(filename) { runFfmpeg(filename); });

请注意,这可能会导致计算机上出现巨大的负载。您可能需要根据目标物理机上的可用资源(例如,每个物理CPU一个进程和每个CPU核心一个或两个线程)来限制随时运行的线程/进程数。

答案 1 :(得分:1)

这将在节点的正常代码路径中自然发生。如果您有两个文件,如:['video1.mp4', 'video2.mp4']并循环遍历该数组并将每个文件名传递给生成ffmpeg的函数,则它们将并行运行。从根本上说,这在节点中很容易实现。

但是,在网络服务中执行此操作是天真的(您的问题不清楚是否具有Web界面或CLI或者是什么),因为这对于DoS系统停止是微不足道的通过并行发布一些难以维持的数量。这是async.eachLimit使用合理的队列/批处理范例进行救援的地方。