【nodejs每日一讲】事件循环系统的设计和实现

2021-01-12 14:58:02 浏览数 (1)

事件循环相信大家都不陌生,很多同学都知道事件循环是一个"死循环",今天我们看一下这个死循环到底是怎样的。我们先看一个朴素版的事件循环系统。

代码语言:javascript复制
class EventSystem {
  constructor() {
    // 任务队列
    this.queue = [];
  }
  

  // 追加任务
  enQueue(func) {
    this.queue.push(func);
  }

  // 事件循环
  run() {
    while(1) {
      while(this.queue.length) {
         const func = this.queue.shift();
         func();
       }
    }
  }
}
// 新建一个事件循环系统
const eventSystem = new EventSystem();
// 生产任务
eventSystem.enQueue(() => {
  console.log('hi');
});
// 启动事件循环
eventSystem.run();

以上代码实现了一个非常朴素的事件循环系统

1 新建一个事件循环系统

2 生产任务

3 启动事件循环系统

但是我们发现当没有任务的时候,事件循环系统陷入了死循环,这无疑浪费了cpu。我们看一下执行以上代码的cpu的情况(我电脑4核,可以看到以上代码对应的进程几乎完全占据了一个cpu,1/4)。

接着我们优化一下这个朴素版的事件循环。

0 人点赞