🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
在每个Tick的过程中,如何判断是否有事件需要处理呢?这里必须要引入的概念是观察者。 每个事件循环中有一个或者多个观察者,而判断是否有事件要处理的过程就是向这些观察者询问是否有要处理的事件。 这个过程就如同饭馆的厨房,厨房一轮一轮地制作菜肴,但是要具体制作哪些菜肴取决于收银台收到客人的下单。厨房每做完一轮菜肴,就去问收银台接下来有没有要做的菜,如果没有的话,就下班打烊了。在这个过程中,收银台的小妹就是观察者,她收到客人点单就是关联的回调函数。当然,如果饭店经营有方,它可能有多个收银员,就如同事件循环中有多个观察者一样。收到下单就是一个事件,一个观察者里可能有多个事件。 浏览器采用了类似的机制。事件可能来自用户的点击或者加载某些文件时的产生,而这些产生的事件都有对应的观察者。在Node中,事件主要来源于网络请求、文件I/O等,这些事件对应的观察者有文件I/O观察者、网络I/O观察者等。观察者将事件进行了分类。 事件循环是一个典型的生产者/消费者模型。异步I/O、网络请求等则是事件的生产者,源源不断为Node提供不同类型的事件,这些事件被传递到对应的观察者那里,事件循环则从观察者那里取出事件并处理。 在Windows下,这个循环基于IOCP创建,而在`*nix`下,则基于多线程创建。