网络编程Day7-事件驱动模型

事件驱动性思想

事件驱动模型不是什么具体的东西,而是一种“思想”。事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。

关于编程范式,在这里要说说传统编程和事件驱动型编程的区别:

传统编程

传统的编程是如下线性模式的:

1
开始--->代码块A--->代码块B--->代码块C......--->结束

事件驱动型

对于事件驱动型程序模型,它的流程大致如下:

1
开始--->初始化--->等待信号--->特定信号--->相应处理
  • 我们看到了事件驱动型和传统编程的编程风格是完全不同的

  • 事件驱动程序在启动之后,就在那等待,等待什么呢?等待被事件触发。传统编程下也有“等待”的时候,例如:input(),需要用户输入交互数据。但这种等待是有目的性的:期待着用户某些行为,或输入一个特定的字符串、数字等等。如果用户输入不规范,还需要提醒他,并做处理。

  • 而事件驱动程序的等待则是没有目的性的,也不强制用户输入或者干什么。只要某一事件发生,那程序就会做出相应的“反应”。这些事件包括:输入信息、鼠标、敲击键盘上某个键还有系统内部定时器触发。



事件驱动模型介绍

通常,我们写服务器处理模型的程序时,有以下几种模型:

  1. 每收到一个请求,创建一个新的进程,来处理该请求;
  2. 每收到一个请求,创建一个新的线程,来处理该请求;
  3. 每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求

第一种第二种都挺消耗资源的,第三种就是协程、事件驱动的方式,一般普遍认为第3种方式是大多数网络服务器采用的方式。

下图就是典型的事件驱动模型:

  • onclick 绑定着 一个 fun()函数,当事件被触发时(这里是被点击),相应的处理模块,就会运行。


有了这种思想,我们就可以监测用户行为,从而发送响应内容了。

那么,如何去检测用户什么时候点击、点的哪里呢?



检测点击的方法

①创建一个线程循环

这个方式有以下几个缺点:

  1. CPU资源浪费,可能鼠标点击的频率非常小,但是扫描线程还是会一直循环检测,这会造成很多的CPU资源浪费
  2. 如果扫描鼠标点击的接口是阻塞的,又会出现下面这样的问题,我们无法检测键盘是否被按下,因为扫描鼠标时被堵塞了,那么可能永远不会去扫描键盘;(此时,一个线程无法解决问题)
  3. 如果一个循环需要扫描的设备非常多,这又会引来响应时间的问题

②事件驱动模型思想

目前大部分的UI编程都是事件驱动模型,如很多UI平台都会提供onClick()事件,这个事件就代表鼠标按下事件。事件驱动模型大体思路如下:

  1. 有一个事件(消息)队列;
  2. 鼠标按下时,往这个队列中增加一个点击事件(消息);
  3. 有个循环,不断从队列取出事件,根据不同的事件,调用不同的函数,如onClick()、onKeyDown()等;
  4. 事件(消息)一般都各自保存各自的处理函数指针,这样,每个消息都有独立的处理函数;

模型如图所示:



okk,网络编程系列更新到此结束啦,跟计算机网络系列一样,都是 day7,挺巧的哈哈哈

以后新增的更新系列应该是操作系统方面吧(Linux),当然,爬虫系列是不会断更的。byebye~