• 事件驱动
  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. python基础类型—字典

    字典 字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必 ...

  2. javascript--面试题

    (1)javaScript怎么清空数组? 如 var arrayList = ['a','b','c','d','e','f']; 怎么清空 arrayList 方法1:直接改变arrayList所指 ...

  3. 非常实用的使用eclipse的快捷键和技巧

    解决代码的自动提示问题: 1.打开 Eclipse -> Window -> Perferences 2.找到Java 下的 Editor 下的 Content Assist , 右边出现 ...

  4. 【Swing程序设计/常用面板】

    面板也是一个Swing容器,可以作为容器容纳其他组件,但是它必须要被添加到其他容器中.Swing常见的面板是JPanel面板和JScrollPanel面板. JPanel面板可以聚集一些组件来布局. ...

  5. RabbitMQ之路由键转发消息

    RabbitMQ学习 参考:https://www.jianshu.com/p/6b62a0ed2491 消息队列:目前流行的有 Kafka.RabbitMQ.ActiveMQ等 功能:为了解决消息的 ...

  6. LINUX常用命令 --- 权限篇

    linux常用命令 linux用户权限相关 root 用户    相当于群主    超级用户 sudo命令   相当于群管理员 普通用户    群成员 查看用户id信息      使用linux    ...

  7. linux_vim_emmet插件的安装配置

    首先要去如下网址下载一个安装包(英文基础好的同学可以去github上搜他的开源,写的更加详细) https://www.vim.org/scripts/script.php?script_id=298 ...

  8. Mycat了解下

    首先说下,因为本身不怎么推荐中间件,所以我对这东西也只是了解,业内mycat用的最好的应该顺风算一个,但是他们是做过二次开发的,咱菜鸡比不了,据说最近出来一个叫cetus的还不错,有空可以关注下 Ⅰ. ...

  9. [设计语言][统一建模语言][软件开发方法学][UML] UML

    背景介绍 UML是一种统计建模语言. WIKI: https://en.wikipedia.org/wiki/Unified_Modeling_Language UML是OMG (object man ...

  10. 使用pm2在同服务器配置开发、生产、测试等环境

    export NODE_ENV=production 只能适用于node xxx.js的前台运行 set NODE_ENV=production貌似无效 pm2 做法: 创建pm2.config.js ...