1、异步编程

[1] 同步和异步描述的是进程/线程的调用方式

同步和异步

  • 同步调用指的是线程发起调用后,一直等待调用返回后才继续执行下一步操作,这并不代表CPU在这段时间内也会一直等待,操作系统多半会切换到另一个线程上去,等到调用返回后再切换回原来的线程。

  • 异步就相反,发起调用后,线程继续向下执行,当调用返回后,通过某种手段来通知调用者。

解释和说明

  • 我们需要注意同步和异步过程中的调用返回,指的是内核进程将数据复制到调用进程。上面说的顺序式编程里面,通常调用就是同步的,上一步执行结束之后才会执行下一步。而异步编程中,如果遇到等待的操作,会继续往下执行,直到请求返回结果在进行处理。

  • 写一个使用多线程或多进程抓取网站内容的爬虫,但由于网络请求或对方网站等问题,导致某段时间内的请求网站请求很慢。即使设置的超时时间,那么在超时时间到来之前,这些进程或线程都是一个等待的状态,什么也干不了。

  • 而异步编程就很适合使用在如上的场景中,它可以通过切换任务的方式尽量减少闲置时间。如遇到等待的请求就先回跳过并执行下一个请求,等执行完成之后再回到这个请求。如果还是没有就绪,就切换到下下一个请求。

[2] 同步和异步编程模型解释及其图示说明

单线程的同步模型

在一个时刻,只能有一个任务在执行,并且前一个任务结束后一个任务才能开始。如果任务都能按照事先规定好的顺序执行,最后一个任务的完成意味着所有任务都完成。

多线程/多进程的同步模型

  • 每个任务都在单独的线程/进程中完成,且都是由操作系统来管理的。如果在多核CPU的系统里面,它们可能会相互独立的运行,而在单核中会交替的运行。

异步编程模型

  • 这个任务是在单线程的控制下任务交错完成的,相对于多线程或多进程简单很多,没有了内容复制、资源传递的问题。而且,程序的控制权完全在我们手里,而不会被操作系统收回自行处理。

  • 在这种异步编程模型,开发者只需要将任务组织成为一个序列,交替的小步完成。每一个异步调用需要足够的小,当然不能耗时太久。

  • 可以看到下一图中的这种模型,并没有看到异步编程的太多的优势的,而且线程之间的切换还会带来额外的开销。异步编程,适应于那些任务强制等待或者阻塞的时候,才能发挥其优势所在。

  • 那些任务强制等待或者阻塞的原因,大多是因为传输数据或访问外部设备等带来的I/O操作或网络请求。这里的Waiting就是请求开始到响应之间需要等待的时间,就阻塞了。

  • 一个典型的CPU处理数据的能力是硬盘或网络请求的好几个数量级,因此一个需要大的I/O操作的同步程序,需要花费大量的时间等待I/O操作或网络将数据准备好。这是因为这个原因,同步的程序就叫做阻塞的程序。

[3] 操作系统模型中的进程变化状态

阻塞和非阻塞

  • 阻塞与非阻塞的概念是针对IO状态而言的,关注程序在等待 IO 调用返回这段时间的状态。当线程或进程调用每一个函数的时候,如果需要等待I/O请求等待竞争资源的时候,操作系统就绪将其阻塞起来,避免浪费更多的CPU资源。等待完成之后,将其转换为就绪状态继续运行。

  • 阻塞和非阻塞,以及同步和异步,完全是两组概念且之间并没有一个必然的联系。也就是阻塞并不等于同步,非阻塞并不等于异步。

2、IO 编程模型

该编程模型是为了解决 I/O 比较慢而产生的,熟悉和理解该模型有利于我们自己编写异步非阻塞的代码

什么是 IO 模型

  • 当I/O发生的时候就会涉及到对象和步骤的操作,我们这里以网络I/O的read为例。它会涉及到两个系统对象,一个是调用这个I/O操作的进程或线程,另一个就是系统内核。当read操作发生时,第一步会等待数据准备(磁盘到内核内存),第二步会将数据从内核拷贝到进程中去(内核内存到进程内存)。

  • 而在Python编程中,第一阶段是准备数据阶段,第二阶段是返回计算结果阶段。所以对于下面的模型说明,需要我们自行对照理解。

[1] 阻塞型 I/O 模型

在I/O执行的两个阶段中,应用进程都被阻塞状态,即准备数据阶段和返回计算结果都是处于等待的状态中,消耗CPU性能。

[2] 非阻塞 I/O 模型

非阻塞型I/O中,应用进程需要不断的主动询问第一阶段是否已经完成了。应用进程在第一阶段虽然不用一直阻塞,但是需要不断的主动询问,基本属于忙等状态,所以非阻塞型不一定比阻塞型就好。

[3] 复用 I/O 模型

在应用进程和内核中间加一个代理,所有的请求都交给代理去处理,自己只需要等待结果就可以了。这个代理就是我们熟知的select和poll模型,两者基本没有区别。

即使有了代理,依然还是阻塞的,因为有可能会阻塞在代理上,如select和poll。有了代理最大的好处是,即使阻塞了但代理还可以接受其他用户请求。对性能没有太大的提升,因为还是阻塞的,只是能够处理其他请求而已。

[4] 信号驱动式 IO 模型

在第一阶段中,应用进程只需要通知内核加载磁盘内容,加载完成之后,内核会通知已经完成。应用进程还可以响应其他请求,而不怕阻塞在代理上。

可以理解为,一个进程可以响应多个请求,这里的性能不一定非常好,因为I/O的第二阶段还是处于阻塞的状态。

[5] 异步 IO 模型

五种I/O模型里面,除了异步IO模型以外,都是同步的。所以,再次验证了阻塞并不等于同步,非阻塞并不等于异步。

异步I/O模型,应用进程只需要通知内核,内核默默的完成第一和第二阶段,完成之后通知进程已经完成了。真正的实现了不阻塞、不等待的模型。一个进程可以响应多个请求,性能极大地提升。

水平触发:完成之后通知应用进程,如果没有收到,会一直发送,直到处理位置,非常消耗资源。

边缘触发:完成之后通知应用进程,只通知一次,如果没有处理则存放起来并告诉其位置,比较好的方式。

3、事件驱动

这些使用场景大多出现在C/S模型中网络比较繁忙的服务器端

异步模型的使用场景

  • 有大量的任务,因此在一个时刻至少有一个任务要运行

  • 任务执行大量的I/O操作,同步模型会让任务阻塞而浪费CPU时间

  • 任务之间相互独立,以至于任务内部的交互很少

事件驱动模型就是通过事件来触发对应的操作

事件驱动模型

  • 事件驱动模型主要应用在图形用户界面、网络服务和Web前端上。举个编写图形用户界面程序的例子,要给界面上每一个按钮都添加监听函数,而该函数则只有在相应的按钮被用户点击的事件发生时才会执行,开发者并不需要事先确定事件何时发生,只需要编写事件的响应函数即可。监听函数或者响应函数就是所谓的事件处理器(event handler),类似的事件还有鼠标移动、按下、松开、双击等等,这就是事件驱动。

  • 事件驱动的程序一般都有一个主循环(main loop)或称事件循环(event loop),该循环不停地做两件事:事件监测和事件处理。首先要监测是否发生了事件,如果有事件发生则调用相应的事件处理程序,处理完毕再继续监测新事件。事件循环只是在一个进程中运行的单个线程

  • 在Python2标志性的异步框架就是Tornado(也存在事件循环)、Twisted(基于事件驱动的网络引擎框架)、Gevent(使用的是协程),它们的共同特点就是异步非阻塞,而在Python3.6标准库中已经自带了asyncio。

需要学习资料的可以来找博主领取哈!

Python异步编程和事件驱动相关推荐

  1. python 异步编程——asyncio

    python 异步编程--asyncio 摘要 1. 协程 1.1 基本概念 1.2 实现方法 1.2.1 greenlet 1.2.2 yield 1.2.3 asyncio模块 1.2.4 asy ...

  2. python2异步编程_最新Python异步编程详解

    我们都知道对于I/O相关的程序来说,异步编程可以大幅度的提高系统的吞吐量,因为在某个I/O操作的读写过程中,系统可以先去处理其它的操作(通常是其它的I/O操作),那么Python中是如何实现异步编程的 ...

  3. python编程入门-Python 异步编程入门

    本文是写给 JavaScript 程序员的 Python 教程. Python 的异步编程,其他人可能觉得很难,但是 JavaScript 程序员应该特别容易理解,因为两者的概念和语法类似.JavaS ...

  4. 最新Python异步编程详解

    我们都知道对于I/O相关的程序来说,异步编程可以大幅度的提高系统的吞吐量,因为在某个I/O操作的读写过程中,系统可以先去处理其它的操作(通常是其它的I/O操作),那么Python中是如何实现异步编程的 ...

  5. python生成器单线程_「Python异步编程-3」协程、生成器、yield 的联系

    异步编程的基础在于理解协程,而协程的基础在于理解生成器,而生成器的基础在于理解yield关键字,下面就来说说这几个概念. 什么是yield关键字? 相当于return关键字,在每次next(),或者f ...

  6. python程序设计-Python 异步编程入门

    本文是写给 JavaScript 程序员的 Python 教程. Python 的异步编程,其他人可能觉得很难,但是 JavaScript 程序员应该特别容易理解,因为两者的概念和语法类似.JavaS ...

  7. Python异步编程例子

    以下是一个Python异步编程的例子: import asyncioasync def hello():print("Hello")await asyncio.sleep(1)pr ...

  8. Python异步编程详解

    一.异步编程相关概念 1.I/O模型 IO操作实际过程涉及到内核和调用这个IO操作的进程.对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝 ...

  9. python异步编程

    数据库类型 数据库名称 异步数据库 说明 key_value数据库 shelve Python常用库 - shelve // Blue Wish (isware.cn) redis tornado-r ...

最新文章

  1. 阿里120页PPT诠释国家“智能+”战略
  2. [导入]伍迷创意随想集 之 聚众广告创精品
  3. python中如何调用类_python如何调用java类
  4. shell date常用运算命令
  5. 教你构建MySQL主从结构,实现基于SSL加密的主从同步机制。
  6. oracle视图总结(创建、查询、改动、删除等)
  7. 【笔试/面试】—— 不使用大于、小于、if 语句,实现 max 宏
  8. hhvm mysql_Ubuntu 14.10 安装 Nginx + MySQL + HHVM + phpMyAdmin [LNMH]
  9. networkx设置节点的大小_节点大小取决于NetworkX上的节点度
  10. 微软王码五笔86版 for winnt/2000/xp v7.3 免费
  11. Spark学习笔记(一)
  12. 学习笔记(01):程序员的数学:微积分-常用导数(一):最常用到的技巧
  13. 自学Java day53 使用jvav实现 字典树 数据结构 从jvav到架构师
  14. 计算机漫游模式,深入理解操作系统之一 —— 计算机系统漫游
  15. HTML5期末大作业:旅游网页设计与实现——四川成都-(9页 带购物车)
  16. DirtyWordsFilter(脏字过滤)
  17. 《嵌入式 - 嵌入式大杂烩》详解J-Link RTT打印
  18. registration status: 204
  19. emi滤波matlab,EMI滤波器的基本原理
  20. 360电视盒子项目暂时搁浅

热门文章

  1. 微信小程序轮子 - 调起摄像头拍摄照片并获取照片路径(可用于拍摄身份证 / 人像等等)
  2. c++ 使用bcrypt_如何使用`bcrypt`方式加密
  3. springboot xss
  4. OpenCV—python 颜色空间(RGB,HSV,Lab)与 颜色直方图
  5. Avalonia的资源和样式
  6. i59400f和i59600kf有什么区别 i5 9400f和i5 9600kf哪个性价比高
  7. aspose将word转pdf时乱码,或者出现小方框问题
  8. Concatenate[图解]
  9. 星梦缘陈彦妃_《星梦缘》里的“林思彤”陈彦妃都当妈了!竟然被宝宝这件事难倒了........
  10. c语言 vector用法,C++ vector用法初记