代码之家  ›  专栏  ›  技术社区  ›  Nicolas Guérinet

事件发射器是否在nodejs中消耗资源?

  •  0
  • Nicolas Guérinet  · 技术社区  · 6 年前

    我想知道我是否应该创建一个EventEmitter并将一个对象传递给它,在这个对象中,回调函数内部将有一个键来运行一些代码,这取决于对象内部的键(我将有15种不同的情况),还是应该根据15种不同的名称创建15个EventEmitter留言?我想知道创建多个evenemitter是否会减慢速度,占用nodejs实例的RAM或CPU资源

    像这样:

     const EventEmitter = require('events');
     class MyEmitter extends EventEmitter {}
     const myEmitter = new MyEmitter();
    
     myEmitter.on('event1', (data) => console.log(data)); // receiver code
     myEmitter.on('event2', (data) => console.log(data)); //receiver code
     myEmitter.emit('event1','event1'); //sender code
     myEmitter.emit('event2','event2'); //sender code
    //event3
    //event4
    //...
    

    或者类似的:

    const EventEmitter = require('events');
    class MyEmitter extends EventEmitter {}
    const myEmitter = new MyEmitter();
    let obj1 = { msgType:'event1',data:'one exemple'}; // sender code
    let obj2 = { msgType:'event2',data:'another exemple'}; //sender code
    
    
    myEmitter.on('event', (data) => { //receiver code
    
    if (data.msgType=="event1"){
    console.log("event1");
    }
    if (data.msgType=="event2"){
    console.log("event2");
    }
    
    });
    
    myEmitter.emit('event',obj1); //sender code
    myEmitter.emit('event',obj2); //sender
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   jfriend00    6 年前

    所有事件发射器都只是一个javascript对象,它保留包含各种方法的侦听器的数据结构。发射器中的非活动侦听器不占用CPU,只占用与其正在侦听的回调引用和消息名(因此几乎没有RAM)相同的RAM。

    您可以有尽可能多的发射器,以符合您的代码。它们既便宜又高效。你可以把它们想象成一个静态的听众数组。当你这样做的时候 .addListener() ,它向数组中添加一个项。当你这样做的时候 .removeListener() ,它从数组中移除一个项。当你这样做的时候 .emit() 它找到与特定消息匹配的侦听器并调用它们(仅函数调用)。

    还是应该根据15个不同的消息名称创建15个事件发射器?

    EventEmitter是为处理许多不同的消息名称而构建的。所以,仅仅因为你有15条不同的消息,那就没有理由制造15个独特的事件发射器。您可以轻松地使用一个EventEmitter并调用 .emit()。 上面有你所有不同的信息。

    创建多个事件发射器的原因与代码的设计和体系结构有关。如果您有一个想要模块化和可重用的组件,并且它使用 eventEmitter ,然后它可能希望创建自己的发射器,并将其提供给客户机,这样它就不必依赖于其他也希望使用EventEmitter的代码,但在其他方面与此特定模块没有任何关系。所以,这是一个体系结构和代码组织问题,而不是运行时效率问题。只创建尽可能多的EventEmitter作为您的架构自然需要,而不是更多。

    我想知道创建多个EventEmitter是否会减慢速度,占用我的nodejs实例的RAM或CPU资源

    不,不会的。每个EventEmitter只需要很小的内存就可以初始化其基本实例数据,但这太小了,以至于您可能无法测量1或这些实例与15个实例之间的差异。

    我想知道是否应该创建一个EventEmitter并将一个对象传递给它,在这个对象中,根据对象中的键,回调函数内部会有一个键来运行一些代码。

    如果你愿意的话,你可以自由地用这种方式设计你的代码,但是你要为自己做额外的工作,并且写的代码可能不够干净。EventEmitter的一大优点是,它们为每个单独的消息维护一组特定的侦听器。如果使用一条常规消息,然后将实际消息嵌入传递给 .emit()。 调用,那么您只需丢弃eventEmitter拥有的特性,并在调用代码上增加负担,以确定此事件中实际包含哪些子消息。

    一般来说,使用 EventEmitter . 相反,将实际事件名放在 .emit()。 并让代码为它想要监听的实际事件名注册一个监听器。

    所以,在你展示的两个计划中,我非常喜欢第一个。就是这样 EventEmitters 是为使用而设计的,也是为帮助你而设计的。在某些情况下,您可能需要使用自己的子路由生成一个通用消息,但是除非您确定需要这样做,否则您不应该增加额外的复杂性,并且您将放弃EventEmitter免费为您提供的功能。


    此外,您还将显示以下代码:

    class MyEmitter extends EventEmitter {}
    const myEmitter = new MyEmitter();
    

    您是否认识到,不需要为了使用事件发射器而对其进行子类化。如果要在子类上添加或重写方法,则只能对其进行子类化。但这段代码没有显示实际的新方法或重写,因此没有必要这样做。

    如果只想使用EventEmitter,只需创建一个:

    const myEmitter = new EventEmitter();