gpt4 book ai didi

javascript - 限制在 Node.js 中的循环中产生的并发子进程数

转载 作者:行者123 更新时间:2023-11-30 20:03:28 24 4
gpt4 key购买 nike

我正在尝试使用 child_process.spawn 在 for 循环中调用 CLI 工具,每次调用时使用不同的参数。到目前为止一切顺利,但是如果我想引入最大数量的子进程并且只在前一个进程关闭时继续生成新进程,我就会遇到麻烦。当达到有限的子进程数量时,我想用无限 while 循环停止 for 循环。但是,子进程似乎永远不会触发“关闭”事件。

ls 为例(抱歉,我想不出一个好的、持久的命令,可以在一段时间后自动退出):

const { spawn } = require("child_process");

const max = 3;
let current = 0;

// dirsToVisit is an array of paths
for (let i = 0; i < dirsToVisit.length; i++) {
// if already running 3 ls, wait till one closes
while (current >= max) {}
current++;
lsCommand(dirsToVisit[i]);
}

function lsCommand(dir) {
const ls = spawn("ls", [dir]);
ls.on("close", code => {
current--;
console.log(`Finished with code ${code}`);
});
}

上面的代码永远不会退出,当子进程退出时要在控制台中记录的字符串永远不会打印在屏幕上。如果我删除 while 循环,所有子进程最终都会毫无问题地完成,但同时允许的进程数量没有限制。

为什么我的代码不工作,我如何正确地限制循环中产生的子进程的数量?任何帮助将不胜感激!

最佳答案

您的代码不起作用,因为 lsCommand() 是非阻塞的、异步的。它所做的只是启动 spawn 操作,然后立即返回。因此,您的 for 循环开始运行,然后您的 while 循环在 for 循环的第一次迭代中运行并启动 max lsCommand () 调用然后退出。 for 循环的后续迭代无事可做,因为 max lsCommand() 调用已经在运行。所以,因为 lsCommand() 是非阻塞的,你的 for 循环结束了,它所做的只是开始 max lsCommand() 操作,然后你的循环就完成了。您需要做的是,您必须通过监视 ls.on('close')` 来观察每个 lsCommand() 的完成,然后当每个完成时,您可以开始另一个。您可以在下面的代码中看到我是如何做到这一点的。



你可以做这样的事情,你可以创建一个内部函数,它有一个循环来启动进程达到你的限制,然后你只需在每次生成操作完成时继续调用该函数(每次都会触发一个)一个完成):



function listDirs(dirsToVisit, maxAtOnce) {
let numRunning = 0;
let index = 0;

function runMore() {
// while we need to start more, start more of them
while (numRunning < maxAtOnce && index < dirsToVisit.length) {
++numRunning;
const ls = spawn("ls", [dirsToVisit[index++]]);
ls.on("close", code => {
--numRunning;
console.log(`Finished with code ${code}`);
runMore();
}).on("error", err => {
--numRunning;
runMore();
});
}
if (numRunning === 0) {
// all done with all requests here
}
}
runMore();
}

对于一些更通用的实现,请参见这些:

Loop through an api get request with variable URL

Promise.all consumes all my RAM

Javascript - how to control how many promises access network in parallel

Nodejs: Async request with a list of URL

关于javascript - 限制在 Node.js 中的循环中产生的并发子进程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53144401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com