【发布时间】:2019-11-24 18:07:06
【问题描述】:
我在使用 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 });
});
【问题讨论】:
-
另外,请在父进程中显示接收代码的相关部分,因为这也可能是问题所在。
-
此外,这将无法正常工作:
this.on('MyEvent', this.produce);你需要this.on('MyEvent', this.produce.bind(this)); -
这不是无限循环吗。你做
producer.emit('MyEvent')来开始。构造函数中的事件处理程序接收到它并调用this.produce(),然后再次执行this.emit('MyEvent, output);,构造函数中的事件处理程序接收到它再次启动它 - 无限循环。 -
@jfriend00,添加了父逻辑。现在很简单。
-
无限循环在 nodejs 中通常不起作用,因为您不会让事件循环处理任何可能导致网络停滞的事情。
标签: javascript node.js ipc eventemitter event-loop