前言

最近有人在twisted邮件列表中问有没有一个可以让人快速学习twisted的文档.总体的来说:这个系列不是这样的一个文档.如果你没有很多时间或者耐心的话,这个系列的文章不太适合你.

不过,如果你对异步编程了解很少的话,相信一个简短的介绍也不让你完全明白,当然如果你是天才除外.我学习和使用twisted已经好几年了,通过这几年的学习和工作我得出的结论就是:学习twisted困难的地方就是对异步编程的理解而不是怎样去用twisted 的函数去写代码. twisted 的代码写的都很简洁和清晰,而且有很好的注释和文档,但是如果没有理解异步编程的思想而直接去读twisted 的源码的话会让你有twisted 的感觉.

这个系列的第一篇会讲异步编程,后面的章节才会降到twisted.首先让我们以一个简单的实例来说明异步编程是怎么工作的吧.

模型

为了更好的理解异步模型,我们先来回顾一下我们经常遇到的一些模型:同步模型和多线程模型.让我们假想一个程序要完成三个任务,先让我们看看同步模型是怎么来工作的,如下图,

图片一

这个是最简单的执行任务的方式,也是我们在平常写程序的时候经常用到的,完成一项工作之后再去做另外一件事情,每次只执行一项任务.

我们可以比较同步模型多线程模型,如下图:

图片二

在这种模型当中,每一个任务被分配在单独的线程当中工作,多个任务可以同时进行,这种模型下,每个任务是被认为是独立的.但是在现实中,很多时候每个线程并不是独立,在运行的过程中需要从其他的线程中去获取结果,这样就使各个进行的交互和协作变得复杂,在一个大的系统中,进程之间的交互会更复杂.

最后是我们要讲的异步模型.如下图

图片三

在异步模型中,每个任务进行交替进行,但是仍在一个进程中.异步模型会比多线程模型更简单些,因为每个任务的运行状态都是可以被我们控制的.虽然在同步模型也可以让任务交替运行,但这往往需要多个线程协作才能完成.单线程异步模式可以保证程序运行在一个线程中,即使在一个多进程系统中.

异步模型和多线程模型还有一个不同的地方是,多线程除了程序的控制之外,还受到操作系统的控制.

相反的在一个异步模型的程序中,一个任务会一直运行下去,直到任务被运行完或者程序暂停这个任务而去执行令一个任务.

重要的一点是,在异步模型可以多线程模型可以很好结合起来,但在这个系列教程中我们还只涉及到异步模型.

为什么(为毛)

从上面的讲解中我们可以看到异步模型比多线程模型更简单些,因为异步模型只有一个进程而且任务的停止和运行状态是可控的.但比同步模型相比还是比较复杂,程序员必须把每一个任务分成很多步然后再有序的把他们组合起来,如果一个任务用到了令一个任务的结果,这个任务需要接受另一个任务的输出做为他自己的输入,而且这种接收的数据经常是一段一段的而不是一个整体. 你不禁要问既然异步模型和同步模型都是一个线程,他们执行相同的任务应该花费相同的时间啊,甚至比同步模型花费的时间更多,为什么要才采用异步的模型呢?

这里最少有两个原因,第一,如果多个任务中的一个任务负责实现一个人机交互接口,在等待用户输入的时候,可以让其他的任务先去执行,等用户输入时再去处理用户的输入.

所以如果说异步模型比同步模型快的话是有条件限制的,如果你的程序中会有阻塞,或者被强迫等待,异步模型会是你的选择.同步模型在有阻塞的时候的执行过程应该是这样的

图片四

在这个图中灰色的部分代表了一个任务正在等待(阻塞). 为什么一个任务会被阻塞呢? 一个经常的原因就是等待执行I/O ,传输数据. 一般来说CPU 处理数据的速度比磁盘和网络块,因此当一个同步的程序要处理很多I/O时会花费很多时间用于等待,这样的一个同步程序也被叫做”阻塞程序”

注意图片4,一个阻塞程序,有点像图片3,一个异步程序.这不是一个巧合,异步模型的设计原理就是,当其中一个任务被阻塞时,可以先去执行其他的可以执行的任务.所以一个异步程序仅仅会在没有任务可以执行的时候,所以一个异步程序也会被叫做无阻塞程序.如果一个程序中有很多阻塞的任务,异步模型可以比同步模型更高效.

和同步模型相比,异步模型在下列情况时表现更好:
1,有很多任务,经常总有一个任务可以继续执行的时候
2,这些任务中要执行很多I/O操作
3,这些任务大多都是独立的

这些情况大都描述了一个非常繁忙的web server,每一个任务代表了一次接收请求和发送结果,而这些client 请求大多都是独立的,所以一个web server 的实现一个很好的异步模型的实现,这就是twisted被叫做网络编程库.

Onward and Upward
这个系列的第一个部分就完啦,在第二部分,我们将写一些网络程序,阻塞的和非阻塞的都有,没有用twisted.让我们先体会一下一个异步的程序是怎样运行的.

python twisted教程一,异步编程相关推荐

  1. python协程和异步编程

    文章目录 协程 & 异步编程(asyncio) 1. 协程的实现 1.1 greenlet 1.2 yield 1.3 asyncio 1.4 async & awit 1.5 小结 ...

  2. GEE学习笔记 六十七:【GEE之Python版教程一】GEE学习背景介绍

    相信很多人都对GEE已经比较熟悉了(只是不熟悉GEE的Python的API而已),这里只是做一个简单的总结概括一下GEE相关内容. 1.GEE学习基本要求 目前市面上无论出现什么新的技术,总会出现一种 ...

  3. Python 3 教程一:入门

    Python已经是3.1版本了,与时俱进更新教程.(由于Django不支持python3, 所以为了你的发展潜力, 建议你学习python2.x ) python 2.x教程地址: http://ww ...

  4. python asyncio_Python 中的异步编程:Asyncio

    异步和同步的代码对比 现在我们实际验证异步模式的切实有效,我会比较两段 python 脚本,这两个脚本除了sleep方法外,其余部分完全相同.在第一个脚本里,我会用标准的 time.sleep 方法, ...

  5. C语言简单教程一:编程的第一课

    今天将带大家走进C语言的世界一个神秘又充满乐趣的世界,接下来将给大家一些指导关于获取编译器,建立第一个自己的程序. 首先是准备C语言编程的编译器 建立第一个关于自己的程序 学习C语言的方法与习惯 C语 ...

  6. python AIOT教程一1.必备多元函数微分学理论基础

    本篇博客主要给大家介绍一下,在学习python AIOT方向中,必备的数学基础知识. 一.多元函数 定义设D为一个非空的n 元有序数组的集合, f 为某一确定的对应规则. 若对于每一个有序数组,通过对 ...

  7. python 多线程和协程结合_Python 异步编程,看这门课就够了~

    我们常见的 Linux.Windows.Mac OS 操作系统,都是支持多进程的多核操作系统.所谓多进程,就是系统可以同时运行多个任务.例如我们的电脑上运行着 QQ.浏览器.音乐播放器.影音播放器等. ...

  8. 教孩子学编程 python 下载_趣学python pdf 中文下载

    趣学python教孩子学编程pdf是一本专为想要学习python不错的朋友准备的入门教程,可以轻松的帮之你由浅入深,由难到易的学习python编程,感兴趣欢迎下载学习! 趣学python教孩子学编程p ...

  9. Python Twisted、Reactor

    catalogue 1. Twisted理论基础 2. 异步编程模式与Reactor 3. Twisted网络编程 4. reactor进程管理编程 5. Twisted并发连接 1. Twisted ...

最新文章

  1. 召唤超参调优开源新神器:集XGBoost、TensorFlow、PyTorch、MXNet等十大模块于一身...
  2. HDU1531(差分约束+Bellman_ford)
  3. Spring方法注入 @Lookup注解使用
  4. LeetCode之Remove Duplicates from Sorted Array
  5. 不搞代码来搞我,我又动了谁的奶酪?
  6. 二分法(三):采用二分法解决“最大化最小值问题”
  7. 5、SQL Server数据库、T-SQL
  8. 黑塞矩阵-二阶偏导矩阵
  9. 天池性能挑战赛-高性能分析型查询引擎复赛12名赛后方案分享
  10. 安全合规/等级保护--13--我们通过了等级保护三级认证
  11. qdir 类似工具_Qdir中文版|多窗口资源管理器下载_最火软件站
  12. 高中计算机网络技术应用教案,高中信息技术选修3《网络技术应用》教案.doc
  13. Python-文件操作
  14. 【Laravel系列6.3】框架启动与服务容器源码
  15. python 安装ltp
  16. 【历史上的今天】12 月 12 日:英特尔创始人出生;PSP 发布;双十二购物狂欢节
  17. eclipse如何查看错误信息
  18. Web前端:木兰花令网页案例设计
  19. 敲开bp神经网络之门(三,机器视觉斑点blob匹配中使用)
  20. 【机器学习面试】百面机器学习笔记和问题总结+扩展面试题

热门文章

  1. 本地使用Rfam 12.0+
  2. 6款英雄主题fcpx标题字幕插件:Hero Shot Titles for Mac
  3. html button跳转页面_Html
  4. 提高级:初等数论 威尔逊定理
  5. python报错:xml.parsers.expat.ExpatError: not well-formed (invalid token): line 3, column 1的解决办法
  6. dos导入mysql数据库表_用DOS命令在Linux下mysql数据库的导入导出操作
  7. node mysql await_javascript – node.js async / await与MySQL一起使...
  8. Web前端笔记-画布拖动及放缩(two.js)
  9. Linux学习笔记-管道的读写特性
  10. 7.2图的存储结构(邻接表)