Javascript eventemitter.emit方法不';t在节点js中返回

Javascript eventemitter.emit方法不';t在节点js中返回,javascript,node.js,ipc,eventemitter,event-loop,Javascript,Node.js,Ipc,Eventemitter,Event Loop,我在使用eventemitter.emit方法时遇到问题 基本上这就是我想做的。我有一个长时间运行的进程(以CPU为界)生成输出对象,由于这是以CPU为界的进程,所以我使用fork()将其作为单独的进程运行 生成每个输出后,我希望将其发送到父进程。还可以使用它来发出一个事件以生成另一个对象,依此类推 现在的问题是,process.send(output)似乎没有执行。我可以看到控制台中一个接一个地打印输出。但是父母似乎没有从孩子的过程中得到任何东西。在我的理解中,nodejs事件循环在完成当前任

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

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

生成每个输出后,我希望将其发送到父进程。还可以使用它来发出一个事件以生成另一个对象,依此类推

现在的问题是,
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 });
});

在我看来,您可能正在耗尽事件循环(从未给它任何处理传入事件的周期),这可能会破坏处理网络的能力,甚至破坏出站网络。我建议您仅在
进程.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
其他值得注意的意见:

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

  • 此外,请在父进程中显示接收代码的相关部分,因为这也可能是问题所在。此外,这将无法正常工作:
    this.on('MyEvent',this.product)this.on('MyEvent',this.product.bind(this))这不是一个无限循环吗。您可以使用
    producer.emit('MyEvent')
    启动。构造函数中的事件处理程序接收该事件并调用
    this.product()
    ,然后调用
    this.emit('MyEvent,output')再次被构造函数中的事件处理程序接收,该事件处理程序重新启动它-无限循环。@jfriend00,添加了父逻辑。现在它非常简单。无限循环通常在NodeJ中不起作用,因为你不让事件循环处理任何可能导致网络停滞的事情。添加了一些注释以进一步解释一些事情。
    
    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