gpt4 book ai didi

javascript - eventemitter.emit 方法在 Node js 中不返回

转载 作者:行者123 更新时间:2023-12-02 22:27:24 28 4
gpt4 key购买 nike

我在使用 eventemitter.emit 方法时遇到问题。

基本上这就是我想做的。我有一个长时间运行的进程(CPU 受限),它生成输出对象,并且由于这是 CPU 受限进程,我使用 fork() 将其作为单独的进程运行。

class Producer extends EventEmitter {
constructor() {
this.on('MyEvent', this.produce);
}

produce(input) {
var output = longRunningProcess();

this.emit('MyEvent, output);
process.send(output);
}
}

var producer = new Producer();
producer.emit('MyEvent', 0); // To kick off the execution

一旦生成每个输出,我想将其发送到父进程。还可以使用它来发出事件来生成另一个对象等等。

现在,问题是 process.send(output) 似乎没有被执行。我可以看到控制台中一一打印输出。但父进程似乎没有从子进程收到任何东西。根据我的理解,nodejs 事件循环不应该在完成当前任务并且堆栈为空之前拾取新任务,但这里的情况并非如此。

你们能帮我解决这个问题吗?

编辑:父进程代码

this.producer = ChildProcess.fork('.path/to/produer.js'silent: true });
this.producer.on('message', (data) => {
this.miningProcess.send({ type: "StopMining", body: 0 });
});

最佳答案

在我看来,您可能会导致事件循环匮乏(永远不会给它任何周期来处理传入事件),这可能会破坏处理网络甚至出站网络的能力。我建议您仅在 process.send() 完成后才开始下一次迭代。

class Producer extends EventEmitter {
constructor() {
this.on('MyEvent', this.produce.bind(this));
}

produce(input) {
let output = longRunningProcess();

process.send(output, () => {
// When the send finishes, start the next iteration
// This should allow the node.js event queue to process things
this.emit('MyEvent, output);
});
}
}

var producer = new Producer();
producer.emit('MyEvent', 0); // To kick off the execution

其他值得注意的评论:

  1. 您需要在事件处理程序上使用 this.product.bind(this) 而不仅仅是 this.product 来确保正确的 this调用该函数时设置值。
  2. 请记住,eventEmitter.emit() 是同步的。它不允许事件队列处理事件,并且 eventEmitter 事件不会经过事件队列。
  3. 此代码假定异步调用 process.send() 回调,并为事件循环提供足够的机会来处理任何正在等待的事件。它还确保在开始下一个 CPU 密集型迭代之前完全发送进程间消息,这将再次暂时阻止事件队列处理。这样,您就可以确保在再次阻塞事件队列之前完成整个通信。
  4. 您可能可以使用适当的位置 setTimeout() 来启动下一次迭代,但我认为在启动下一次迭代之前确保进程间消息传递已完成会更可靠迭代。
  5. 仅供引用,如果您没有将派生的 EventEmitter 用于此处所示以外的任何用途,那么实际上并不需要它。您可以直接调用对象上的方法,而不是使用 EventEmitter 事件。

关于javascript - eventemitter.emit 方法在 Node js 中不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59020819/

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