Javascript NodeJS“;叉子;子进程正在执行,但在退出时不给父进程任何指示符

Javascript NodeJS“;叉子;子进程正在执行,但在退出时不给父进程任何指示符,javascript,node.js,nodes,child-process,Javascript,Node.js,Nodes,Child Process,我正在运行一个for循环,它在每次执行时打开一个不同的fork进程。因为我想限制并发进程的总数,所以我有一个计数,每次启动fork进程时,它增加一个,每次fork进程完成时,它应该减少一个。不幸的是,当子进程完成时,我的父进程没有收到任何指标。以下是我的代码供参考: 父进程: let maxChildren = 2000; let numChildren = 0; for (let i = 0; i < invoicesLen; i++){ let

我正在运行一个for循环,它在每次执行时打开一个不同的fork进程。因为我想限制并发进程的总数,所以我有一个计数,每次启动fork进程时,它增加一个,每次fork进程完成时,它应该减少一个。不幸的是,当子进程完成时,我的父进程没有收到任何指标。以下是我的代码供参考:

父进程:

    let maxChildren = 2000;
    let numChildren = 0;
    for (let i = 0; i < invoicesLen; i++){
        let ran = false;
        while (ran === false){
            if (numChildren < maxChildren){
                let child = fork(__dirname + `/stuff/index.js`)
                numChildren += 1;
                child.on('exit', () => {
                    // This code is not executing at any point
                    numChildren -= 1;
                    console.log('child closed')
                    console.log(`There are ${numChildren} child processes running`)
                })
                console.log(`There are ${numChildren} child processes running`)
                ran = true;
            }
        }
    }

我从子进程中获取“exiting…”控制台日志,但我的函数在child.on中(“exit”…父脚本中的etc不会执行。

对于此类任务,我能给出的最好建议是使用在父进程和子进程之间建立的通道。通过一些技巧,您可以创建一个事件,然后在调用之前发出该事件

子进程上的process.exit()

将事件类导入子进程文件

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
然后创建一个处理函数,用于向父进程报告子进程退出

   function reportExitToParent(){
     process.send({message:`Child process PID: ${process.pid} exited`, type:"Exit event"})
}
将处理程序方法侦听器附加到在process.exit()之前发出的退出事件

myEmitter.on("exit", reportExitToParent);
myEmitter.once("exit");
然后在调用process.exit()之前的子进程主函数中,发出子退出事件

myEmitter.on("exit", reportExitToParent);
myEmitter.once("exit");
对于我的子进程与父进程任务的通信,上述解决方案已被证明是非常稳定的


此方法将使您能够从子进程中发生的此事件中侦听主进程上的此特定消息。然后,您可以使用if检查消息是否包含退出事件的值,并减少或增加计数器的值

如果我错了,请更正我,但我对您答案的解释是at代码进入子流程。如果是这样,我将如何在父流程中捕获此信息?此外,您知道我OP中的代码无法正常运行的原因吗?我已经搜索了文档,出于所有意图和目的,我正在按照它们的安排做事情。也感谢您的回复。是的,这是非常真实的de应该在子进程中使用。实际上,此代码所做的只是建立一个事件,该事件应该在您想要退出子进程的任何时候被触发。您可以看到。一旦它发出退出事件。将调用该事件的侦听器,其目的是向父进程发送一条消息,其中包含有效负载数据
process.send({message:
子进程PID:${process.PID}已退出
,键入:“Exit event”})
。这将在消息侦听器的父进程中接收。然后检查是否键入:Exit event并减少父类中的子进程计数器