11.python并发入门(part13 了解事件驱动模型))

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11.python并发入门(part13 了解事件驱动模型))相关的知识,希望对你有一定的参考价值。

一、事件驱动模型的引入。

在引入事件驱动模型之前,首先来回顾一下传统的流水线式编程。

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

每一个代码块里是完成各种各样事情的代码,但编程者知道代码块A,B,C,D...的执行顺序,唯一能够改变这个流程的是数据。输入不同的数据,根据条件语句判断,流程或许就改为A--->C--->E...--->结束。每一次程序运行顺序或许都不同,但它的控制流程是由输入数据和你编写的程序决定的。如果你知道这个程序当前的运行状态(包括输入数据和程序本身),那你就知道接下来甚至一直到结束它的运行流程。


事件驱动模型的大体执行流程:

开始---->初始化---->等待

当基于事件驱动模型的程序一旦执行,就会开始等待,等待一个事件被触发。(其实等待一个事件被触发的情况,在传统的流水线式编程中也有,“等待”的情况存在,比如说一个raw_input会导致程序去等待用户的输入一个数据。)但是,你需要知道,这两种等待是有不同的!

流水线编程的“等待”是程序的编写者提前知道,或者需要去强制程序的使用者去输入一些数据。

但是事件驱动模型中的”等待“,完全不知道程序的使用者到底要做什么,某件事一旦发生(比如,用户单击了一下鼠标,或者敲了下键盘按键,以及系统内部定时器的触发。)程序就会做出相应的“反应”。


二、简单介绍事件驱动模型。

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

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

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

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


假设,现在需要创建一个线程,利用死循环的方式,去检测用户的鼠标是否有一个点击的动作。

  1. 首先使用死循环去检测鼠标是否有点击动作这个做法就很浪费cpu资源!

  2. 如果检测鼠标是否点击的接口阻塞了,程序停在这了,又会引发另一个问题,如果这时候还要检测,键盘是否有被按下,(有多个事件需要被检测),检测鼠标是否被按下的接口还在阻塞状态,接下来就永远不会去检测键盘。

所以说,现在大部分的UI编程,都基于事件驱动模型,大部分的UI编程都会提供一个onClick()事件,这个事件代表了按下鼠标的一个事件,这个事件处理的大体模型如下:

技术分享

首先先来看上图:

1.事件驱动模型,首先是要有一个事件列表(这个列表相当于消息队列)。

2.一旦点击鼠标,就会在这个事件列表(消息队列)中,添加一个事件(消息)。

3.此时,会有一个循环,不断的从事件列表(消息队列)里面取事件,根据不同的事件调用不同的函数。

4.事件(消息)都有一个独立的处理函数。



本文出自 “reBiRTH” 博客,请务必保留此出处http://suhaozhi.blog.51cto.com/7272298/1926755

以上是关于11.python并发入门(part13 了解事件驱动模型))的主要内容,如果未能解决你的问题,请参考以下文章

11.python并发入门(part14阻塞I/O与非阻塞I/O,以及引入I/O多路复用)

11.python并发入门(part7 线程队列)

11.python并发入门(part4 死锁与递归锁)

11.python并发入门(part12 初识协程)

11.python并发入门(part3 多线程与互斥锁)

11.python并发入门(part1 初识进程与线程,并发,并行,同步,异步)