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

我使用nodejs来捕获videostream,然后使用spawn调用ffmpeg来处理Feed。 如果我收到多个videostream,我想要并行执行此操作。

我可以通过打开多个terminal并使用ffmpeg命令的不同版本来执行进程来手动模仿。

我得到的nodejs是单线程的,我已经审查asynchronous,但没有想出如何这可能适用callback发挥了不可或缺的作用。

基本上我想调用多个ffmpeg进程并行打开几个terminal窗口和处理callback,如错误或退出。

例如

//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实例中启动每个新进程,或者不依赖于您的build议

只要连续调用spawn(...)多次。

每次调用process.spawn(...)启动一个新的OS进程,其中大量的进程可以同时运行。 您不得不为每个实例注册单独的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核心一个或两个线程)来限制正在运行的线程数/进程数。

这将在节点的正常代码path中自然发生。 如果你有两个文件,如: ['video1.mp4', 'video2.mp4']然后遍历这个数组,并将每个文件名传递给你的产生ffmpeg的函数,它们将并行运行。 从根本上来说,这在节点中是很简单的。

然而,在一个networking服务中这么做太天真了(你的问题不清楚它是否有一个web界面,或者是一个CLI或是什么),因为通过启动一个系统来阻止系统停止工作是微不足道的这些并行的数量不成比例。 这里是async.eachLimit通过合理的队列/批处理模式来解决问题的地方。