【问题标题】:How to spawn five child processes in parallel如何并行生成五个子进程
【发布时间】:2021-01-06 11:55:11
【问题描述】:

我想并行运行五个 spawn 命令。我将五个 hls 流 url 传递给循环,这些流链接命令应该记录视频 5 秒,然后终止这些进程。

我尝试以多种方式异步执行...但我不知道如何为每个流独立等待这 5 秒。

我在 Windows 10 上运行它。

这是我尝试的最后一件事:

import { spawn } from "child_process";
import crypto from "crypto"

const hls_streams = [
    'https://stream1.url',
    'https://stream2.url',
    'https://stream3.url',
    'https://stream4.url',
    'https://stream5.url',
]

for (let i = 0; i < hls_streams.length; i++) {
    const filename = crypto.randomBytes(16).toString("hex");
    const child = spawn('streamlink', [`${urls[i]}`, "best", "-f", "-o", `/temp/${filename}.mp4`]);
    await new Promise(r => setTimeout(r, 5000));
    child.kill()
}

五个 url 的正确执行应该只持续 5 秒...

【问题讨论】:

  • 持续多久?您是否发现任何错误?
  • 每个流等待 5 秒,因此至少需要 25 秒才能完成(因为我正在等待 setTimeout 承诺)。没有抛出错误,文件被保存到磁盘。
  • 尝试不在循环内等待?有两个循环,一个创建孩子,然后在睡觉后,再次循环杀死他们。 (嗯,声音很暗)
  • await 在现场等待。因为它在循环中,所以它会在那里等待,然后再继续。

标签: javascript node.js parallel-processing child-process spawn


【解决方案1】:

您可以使用一个循环来创建一个子数组,然后等待,然后另一个循环结束它们。对于基于现有数组创建数组,map() 可能更方便:

import { spawn } from "child_process";
import crypto from "crypto";

const hls_streams = [
    'https://stream1.url',
    'https://stream2.url',
    'https://stream3.url',
    'https://stream4.url',
    'https://stream5.url',
];

let children = hls_streams.map(url => {
    const filename = crypto.randomBytes(16).toString("hex");
    const child = spawn('streamlink', [`${url}`, "best", "-f", "-o", `/temp/${filename}.mp4`]);
    return child;
});

await new Promise(r => setTimeout(r, 5000));

for(let child of children) {
    child.kill();
}

【讨论】:

  • 我同意这种做法
猜你喜欢
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
相关资源
最近更新 更多