2.5.3.2Python-事件驱动模型

总目录:https://blog.csdn.net/qq_41106844/article/details/105553392

Python - 子目录:https://blog.csdn.net/qq_41106844/article/details/105553333

 

 

流水式编程:
开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结束

事件驱动模型:
开始---->初始化---->等待

和事件驱动相比,流水式编程是人为的驱动程序进行,如果人知道传入的数据与程序里面的代码,就能知道整个程序是怎么进行的。而事件驱动模型则是通过事件来驱动程序,比如一次鼠标点击,一次键盘按键,或者计时器的触发,人们不确定什么时候会执行这么,这就是事件驱动。

 

常用的事件驱动模型大概可以分为3类。

当每收到一个请求的时候,创建一个线程来处理请求。

当每收到一个请求的时候,创建一个进程来处理请求。

当每收到一个请求的时候,将一个请求放进事件列表,让主进程通过非阻塞I/O方式来处理请求。#(这种方法是指协程事件驱动的方式。)

之后我们通过一个经典例子说明:
鼠标点击事件

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

<p οnclick="fun()">点我呀</p>

<script type="text/javascript">

    function fun() {

          alert('嘿嘿嘿')

    }

</script>

</body>

</html>

这个检测有两种方式

第一种是线性循环

    这样有几个缺点:
        CPU资源浪费,哪个线程闲的没事就等你点鼠标。

        如果阻塞了,按多少次也没用。

        响应的时间。

第二种是就是事件驱动

事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理

 

 
2.5.3.2Python-事件驱动模型
事件驱动模型

流程:

有一个事件(消息)队列;

鼠标按下时,往这个队列中增加一个点击事件(消息);

有个循环,不断从队列取出事件,根据不同的事件,调用不同的函数,如onClick()、onKeyDown()等;

事件(消息)一般都各自保存各自的处理函数指针,这样,每个消息都有独立的处理函数;

注解:

1.要理解事件驱动和程序,就需要与非事件驱动的程序进行比较。实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的。早期则存在许多非事件驱动的程序,这样的程序,在需要等待某个条件触发时,会不断地检查这个条件,直到条件满足,这是很浪费cpu时间的。而事件驱动的程序,则有机会释放cpu从而进入睡眠态(注意是有机会,当然程序也可自行决定不释放cpu),当事件触发时被操作系统唤醒,这样就能更加有效地使用cpu.

2.再说什么是事件驱动的程序。一个典型的事件驱动的程序,就是一个死循环,并以一个线程的形式存在,这个死循环包括两个部分,第一个部分是按照一定的条件接收并选择一个要处理的事件,第二个部分就是事件的处理过程。程序的执行过程就是选择事件和处理事件,而当没有任何事件触发时,程序会因查询事件队列失败而进入睡眠状态,从而释放cpu。

3.事件驱动的程序,必定会直接或者间接拥有一个事件队列,用于存储未能及时处理的事件。

4.事件驱动的程序的行为,完全受外部输入的事件控制,所以,事件驱动的系统中,存在大量这种程序,并以事件作为主要的通信方式。

5.事件驱动的程序,还有一个最大的好处,就是可以按照一定的顺序处理队列中的事件,而这个顺序则是由事件的触发顺序决定的,这一特性往往被用于保证某些过程的原子化。

6.目前windows,linux,nucleus,vxworks都是事件驱动的,只有一些单片机可能是非事件驱动的。