eventemitter.emit 方法在 Node JS 中不返回



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

最新更新