• 事件驱动
  gevent协程可实现自动切换,协程在遇到IO时会进行切换,到另外一个请求,那协程是如何得知在什么时候在切换回去呢?
 
通常,我们写服务器处理模型的程序时,有以下几种模型:
  (1)每收到一个请求,创建一个新的进程,来处理该请求;
  (2)每收到一个请求,创建一个新的线程,来处理该请求;
  (3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求
 
上面的几种方式,各有千秋:
  第(1)中方法,由于创建新的进程的开销比较大,所以,会导致服务器性能比较差,但实现比较简单。
  第(2)种方式,由于要涉及到线程的同步,有可能会面临死锁等问题。
  第(3)种方式,在写应用程序代码时,逻辑比前面两种都复杂。
  综合考虑各方面因素,一般普遍认为第(3)种方式是大多数网络服务器采用的方式。
 
 
  • 看图说话讲事件驱动模型
在UI编程中,常常要对鼠标点击进行相应,首先如何获得鼠标点击呢?
 
方式一:创建一个线程,该线程一直循环检测是否有鼠标点击,那么这个方式有以下几个缺点:
  1. CPU资源浪费,可能鼠标点击的频率非常小,但是扫描线程还是会一直循环检测,这会造成很多的CPU资源浪费;如果扫描鼠标点击的接口是阻塞的呢?
  2. 如果是堵塞的,又会出现下面这样的问题,如果我们不但要扫描鼠标点击,还要扫描键盘是否按下,由于扫描鼠标时被堵塞了,那么可能永远不会去扫描键盘;
  3. 如果一个循环需要扫描的设备非常多,这又会引来响应时间的问题;
  注:该方式是非常不好的。
 
方式二:就是事件驱动模型
目前大部分的UI编程都是事件驱动模型,如很多UI平台都会提供onClick(鼠标)事件,这个事件就代表鼠标按下事件。事件驱动模型大体思路如下:
  1. 有一个事件(消息)队列;
  2. 鼠标按下时,往这个队列中增加一个点击事件(消息);
  3. 有个循环,不断从队列取出事件,根据不同的事件,调用不同的函数,如onClick(鼠标)、onKeyDown(键盘)等;
  4. 事件(消息)一般都各自保存各自的处理函数指针,这样,每个消息都有独立的处理函数;
 
  • 事件驱动模型
# 网络编程范式 根据事件发生进行相应处理。
# 其他范式:单线程同步、多线程编程。
  当一个事件进入,放入到列表队列内注册任务,如果这个事件处理需要5秒钟,协程会在去处理第二个事件也放入队列内,通过一个不断检测事件的线程来处理相应的事件。这个处理机制是由外部事件如鼠标,键盘来产生,他的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。回调主要是执行线程处理完毕时在次进行的理,同时告诉协程这个事情处理完毕,事件进入注册任务时同时会加一个回调函数,这个回调内容可以自定义。
 

  • 编程范式
  红色(任务1) 、蓝色(任务2) 、黄色(任务3) 、灰色(IO处理)
  这里我们用到了三种编程范式,分别是线程,进程,协程,可以清晰的看出线程用的时间最长效率低,进程虽然效率高但消耗资源,协程分开切换io处理,提高效率并节省资源,将CPU与IO单独进行处理,CPU只负责计算,通过一个线程把IO交给操作系统,并回调结果与协程在次交互。
 

Python 事件驱动了解的更多相关文章

  1. Python 事件驱动与异步IO

    一.事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定.它的特点是包含一个事件循环,当外部事件发生时使用回调机制来出发相应的处理.另外两种常见的编程范式是(单线程)同步以及多线程编程. 1. ...

  2. [转载]python——事件驱动的简明讲解

    本文转载自http://www.cnblogs.com/thinkroom/p/6729480.html 作者:码匠信龙 方便自己今后查阅存档 关键词:编程范式,事件驱动,回调函数,观察者模式 --- ...

  3. python事件驱动的小例子

    首先我们写一个超级简单的web框架 event_list = [] #这个event_list中会存放所有要执行的类 def run(): for event in event_list: obj = ...

  4. 【转】Python练习,网络爬虫框架Scrapy

    一.概述 下图显示了Scrapy的大体架构,其中包含了它的主要组件及系统的数据处理流程(绿色箭头所示).下面就来一个个解释每个组件的作用及数据的处理过程. 二.组件 1.Scrapy Engine(S ...

  5. Python网络编程(4)——异步编程select & epoll

    在SocketServer模块的学习中,我们了解了多线程和多进程简单Server的实现,使用多线程.多进程技术的服务端为每一个新的client连接创建一个新的进/线程,当client数量较多时,这种技 ...

  6. 156个Python网络爬虫资源

    本列表包含Python网页抓取和数据处理相关的库. 网络相关 通用 urllib - 网络库(标准库) requests - 网络库 grab - 网络库(基于pycurl) pycurl - 网络库 ...

  7. 【转】Python 爬虫的工具列表【预】

    这个列表包含与网页抓取和数据处理的Python库 网络 通用 urllib -网络库(stdlib). requests -网络库. grab – 网络库(基于pycurl). pycurl – 网络 ...

  8. Python 运维之路

    第一章:Python基础知识 1.Python 变量了解 .Python 二进制 .Python 字符编码 4.Python if条件判断 5.Python while循环 6.Python for循 ...

  9. 洗礼灵魂,修炼python(52)--爬虫篇—【转载】爬虫工具列表

    与爬虫相关的常用模块列表. 原文出处:传送门链接 网络 通用 urllib -网络库(stdlib). requests -网络库. grab – 网络库(基于pycurl). pycurl – 网络 ...

随机推荐

  1. C# 如何通过mailto标签和SMTP协议两种方式发送邮件

    本文主要讲解如何通过如现mailto标签和SMTP协议两种方式发送邮件,下面就直入主题 方法一.通过mailto标签发送邮件 通过mailto不是正真意义上的发送邮件,它只是会自动调用我们本地默认的邮 ...

  2. Windows下使用VS2017搭建FLTK开发环境

    环境介绍 系统:win10 64位 IDE:VS 2017 Community FLTK版本:1.3.4-2 下载FLTK 截止到本文编写,FLTK的最新稳定版本是1.3.4-2.我们从官网(www. ...

  3. MySQL 5.7新特性之generated column

    MySQL 5.7引入了generated column,这篇文章简单地介绍了generated column的使用方法和注意事项,为读者了解MySQL 5.7提供一个快速的.完整的教程.这篇文章围绕 ...

  4. window下强制删除文件

    在windows系统下,有时候总有一下没办法删除的文件,这个时候可以使用一个命令行脚本强行删除 步骤如下: 把以下代码保存为一个delete.txt文件 DEL /F /A /Q \\?\%1 RD ...

  5. vue中嵌套页面 iframe 标签

    vue中嵌套iframe,将要嵌套的文件放在static下面: <iframe src="../../../static/bear.html" width="300 ...

  6. ubuntu安装python3.6

    环境: ubuntu18.04 64位,python3.6.5 安装过程 1.打开终端 首先创建安装目录, sudo mkdir /usr/local/python3 2.然后下载安装包,解压,并且进 ...

  7. lucene学习教程

    1Lucene的介绍 ①Lucene是什么: 是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎 ②Lu ...

  8. win10系统激活

    我们常常使用一些激活工具来激活,效果可能比较差.比如我激活win10教育版,下载了很多软件无论如何都不能激活.但是使用命令行很容易就激活了. 1. 2.在命令提示符中依次输入: slmgr.vbs / ...

  9. Gym 101873D - Pants On Fire - [warshall算法求传递闭包]

    题目链接:http://codeforces.com/gym/101873/problem/D 题意: 给出 $n$ 个事实,表述为 "XXX are worse than YYY" ...

  10. vue中使用mui滑动条无法正常滑动

    需要引入 `mui.min.js`  引入之后浏览器会报错,mui.min.js中的'caller', 'callee', and 'arguments'是不严格模式的js,而webpack中是严格模 ...