Skip to content

事件驱动机制

元信息

  • 目标:理解"程序由谁驱动"这一软件运行的根本问题——从开发者驱动的批处理、用户驱动的轮询,到事件驱动;体会事件驱动把"等待输入"下沉给系统层带来的性能与结构优势
  • 关键概念:运行流程、驱动方、轮询、事件驱动、监听、分派(dispatch)、事件处理函数
  • 关联阶段:cp3
  • 常见误区:以为事件是"页面上的点击"专有(定时器、页面装载完成等系统状态变化也是事件);以为监听是应用层在死循环等待(监听与分派由底层系统实现);把事件驱动与命令驱动当风格的差异(实为运行时结构的差异——注册回调、等待发生)

软件的运行流程

指一个程序的具体执行路径,由谁来驱动和确定,一般有如下类型:

  • 由开发者主导,允许用户通过配置参数进行定制和驱动
  • 开发者提供各种可能性,但由用户主导和驱动

开发者驱动

c
function main(){
    do_something();
    ...
    do_otherthing();
    exit();
}

命令行CLI软件:适合无人值守的批处理类场景,只在初始执行时接收用户输入参数或配置文件,执行中途不接收输入

用户驱动:轮询

c
function main(){  
    while( char = getc()  )  {
        switch(char)
            case '1'   do_something();
            case '2'   do_otherthing();
             ...
            case 'n'  break; // exit();
    }   
}

命令行软件:适合用户介入的交互型场景,由main程序(应用层)持续等待(轮询)用户的输入。

问题:运行性能较低

用户驱动:事件

import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

桌面软件GUI:由用户(主动)选择和决定程序(被动)的执行路径

事件的轮询(监听和分派)等功能由底层系统支持和实现,性能更优。

事件

  • 事件是开发者、用户、系统之间进行协同的一种机制
    • 开发者声明事件、编写事件处理函数
    • 用户触发事件
    • 系统接收和分派(dispatch)事件,执行相应的事件处理函数
  • 事件是一种抽象,代表了软件的运行时行为,使得软件的功能更加动态
    • 可能来自终端用户的输入,如键鼠
    • 可能系统的状态变化,如页面装载完成、定时器等
  • 事件的监听、分派、调用等,由底层系统支持,而非用户态的应用程序层,更节约系统资源,性能更优。

参考