twisted是python实现的基于事件驱动的异步网络通信构架。
网:https://twistedmatrix.com/trac/
http://www.cnblogs.com/wy-wangyan/p/5252271.html
What is Twisted?
Twisted is an event-driven networking engine written in Python and licensed under the open source MIT license. Twisted runs on Python 2 and an ever growing subset also works with Python 3.
twisted是python实现的基于事件驱动的异步网络通信构架。可以在官网上在线浏览twisted的源码,也有svn可以自行下载,源码还是比较清晰易懂的。接下来的代码或者例子,文档很多都来源于官网介绍。
第一个问题是为什么项目叫twisted? 我的理解是由于构成twisted的主要构件deferred list, 有两个回调链,如图所示,回调链每一项包含一个(callback,errback)对。twisted按照回调链从第一个callback开始执行,如果出错执行下一个回调函数对应的errback,如果执行成功,再回到下下个callback继续执行。是不是很twisted?

第二个问题是什么是基于事件驱动的异步网络框架?
我们写过网络通信程序的都熟悉socket, 都知道select/poll/epoll这些网络多路复用程序,都对应着读或者写操作,twisted的构成中包含一个reacotor的东东,就是很多异步事件框架都有的概念反应堆模式,这是个单例模式,同一时间内只有一个reactor在运行。reactor.run(), 我们说的基于事件就是这样的一个事件循环,twisted等待事件就绪,然后调用回调函数,返回结果。当然它是基于select/poll/epoll的输入输出(读、写)事件。

关于反应堆模式: 请移步这里,这个大牛的翻译:http://www.cnblogs.com/pugang/p/4621373.html
那么什么又是异步? 同样的,我们知道网络通信有几个模式,在各种面试中也或有问到,关于同步,异步,阻塞,非阻塞的区别。
关于这个解释的文章很多,权威的请参考《unix网络编程》中关于unix网络i/o模式的描述。说说我自己的理解,在Linux中所有都是文件,socket当然也是,网络i/o是i/o的一种嘛。我们的应用程序也要包含两部分的内容,一个是用户态一个是内核态的内核调用。网络i/o包含了两部分的内容:
1. 应用程序陷入内核态等待数据就绪
2. 将数据从内核空间复制到用户空间。
阻塞就是在这两个阶段都在等待,都被block了,一直等待内核的返回。
非阻塞就是我们熟悉的socket.setblocking(0),或者fnctl设置的非阻塞flag;它只是在第二个阶段阻塞了,在一个阶段,应用程序知道数据未准备好后,立刻返回错误码EAGAIN/EWOULDBLOCK,知道数据准备结束,复制完毕后返回。
同步指的是等待I/O操作的完成。
异步指的是不必等待I/O操作完成,直接返回,等到第二阶段完成后,内核主动通知进程结束。
所以你说区别,我觉得就是阻塞/非阻塞对应的是一个当前的一个状态,同步/异步着眼于整个大局或操作。
我们今天是要说事件驱动的,前面说了我们依赖于select/poll/epoll,他们都是网络多路复用i/o,用了它们不需要再建多线程,线程池这些东西就能同时监控多个fd。有人叫它们异步(同步)非阻塞I/0, 但是从实际上来说,他们也是同步阻塞的,select/poll/epoll阻塞在select(), epoll.wait()这些函数中,等到数据就绪,然后开始第一个阶段,然后第二个阶段,在第二个阶段中也是I/O阻塞的嘛,所以说它们阻塞在了两个地方,而且需要等待I/O操作的完成。那到底有没有异步I/O,异步I/O需要操作系统底层的支持,目前好像还没有满意的异步I/O,有一些实现也是基于线程/线程池模拟实现。
那twisted既然用到了select/poll/epoll,它为什么叫基于事件的异步框架。因为它模式了异步I/O,它使用reactor模式处理事件循环,使用deferred处理回调函数,用户可以自己写一个回调函数,然后放到deferred list中,twsited会在事件通知就绪后调用这些回调函数,执行完毕,返回结果。看,是不是异步I/O。其它的一些基于事件的异步框架,像java的netty也是这样模拟的。
今天写到这里,下一篇准备分析select/epoll这些多路复用I/O,再从socket/epoll的例子入手,开始twisted的讲解。有错误之处,敬请指正,共同学习
twisted是python实现的基于事件驱动的异步网络通信构架。的更多相关文章
- Python:使用基于事件驱动的SAX解析XML
SAX的特点: 是基于事件的 API 在一个比 DOM 低的级别上操作 为您提供比 DOM 更多的控制 几乎总是比 DOM 更有效率 但不幸的是,需要比 DOM 更多的工作 基于对象和基于事件的接口 ...
- python 3下基于select模型的事件驱动机制程序
它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程.它的流程如图: 当用户进程调用了select,那么整个 ...
- 【Python之路】特别篇--事件驱动与异步IO
通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收到一个请求,放入一个事件 ...
- Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用
目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...
- [python] 3 、基于串口通信的嵌入式设备上位机自动测试程序框架(简陋框架)
星期一, 20. 八月 2018 01:53上午 - beautifulzzzz 1.前言 做类似zigbee.ble mesh...无线网络节点性能测试的时候,手动操作然后看表象往往很难找出真正的原 ...
- 深入理解Node.js基于事件驱动的回调
回调和异步调用的关系 首先明确一点,回调并非是异步调用,回调是一种解决异步函数执行结果的处理方法.在异步调用,如果我们希望将执行的结果返回并且处理时,可以通过回调的方法解决.为了能够更好的区分回调和异 ...
- 基于事件驱动机制,在Service Mesh中进行消息传递的探讨
翻译 | 宋松 原文 | https://www.infoq.com/articles/service-mesh-event-driven-messaging 关键点 当前流行的Service Mes ...
- 创业笔记-Node.js入门之基于事件驱动的回调
基于事件驱动的回调 这个问题可不好回答(至少对我来说),不过这是Node.js原生的工作方式.它是事件驱动的,这也是它为什么这么快的原因. 你也许会想花点时间读一下Felix Geisendörfer ...
- 基于事件驱动的DDD领域驱动设计框架分享(附源代码)
原文:基于事件驱动的DDD领域驱动设计框架分享(附源代码) 补充:现在再回过头来看这篇文章,感觉当初自己偏激了,呵呵.不过没有以前的我,怎么会有现在的我和现在的enode框架呢?发现自己进步了真好! ...
随机推荐
- Postfix+Amavisd-new+Spamassassin+ClamAV整合安装
1. 安装软件和依赖包 apt-get install amavisd-new spamassassin clamav-daemon mysql-client mysql-server apt-get ...
- 【矩阵乘】【NOI 2012】【cogs963】随机数生成器
963. [NOI2012] 随机数生成器 ★★ 输入文件:randoma.in 输出文件:randoma.out 简单对照 时间限制:1 s 内存限制:128 MB **[问题描写叙述] 栋栋近期迷 ...
- LLVM每日谈21 一些编译器和LLVM/Clang代码
作者:闪亮宁(snsn1984) 一些自己的收藏LLVM/Clang代码,而他自己写一些一点点LLVM/Clang译器的代码.在这里把这些代码库分享出来,欢迎大家交流探讨. 1.crange http ...
- cocos2d-x游戏开发 跑酷(四) 关联与物理世界
原创.转载注明出处http://blog.csdn.net/dawn_moon/article/details/21451077 前面一节尽管实现了一个跑动的人物,可是他只不过一个精灵在运行一个跑动的 ...
- 巧妙使用Firebug插件,快速监控网站打开缓慢的原因
原文 巧妙使用Firebug插件,快速监控网站打开缓慢的原因 很多用户会问,我的网站首页才50KB,打开网页用了近60秒才打开?如何解释? 用户抱怨服务器运行缓慢,w3wp.exe 出现 CPU 10 ...
- PreparedStatement与Statement
转载自:http://www.importnew.com/5006.html PreparedStatement是用来运行SQL查询语句的API之中的一个,Java提供了 Statement.Prep ...
- TRIZ系列-创新原理-29-气动或液压结构原理
气动或液压结构原理的详细表述例如以下:1)用气态或液态部件替代固体部件.能够用空气或者水,也能够用气垫或水垫,使这些部件膨胀.这条原理符合系统的动态性进化法则-柔性化.在改造系统时,我们能够尝试将系统 ...
- 3p
哈,不要自卑.爱情和婚姻可遇不可求,缘到自然成.首要的是人好,容貌別太差,毕竟天天在一起看着要舒心才好,另外应该有上进心,避免势利小人.这些,都要看机缘.所谓right person at right ...
- Django Form Media 阅读笔记
---恢复内容开始--- Form Media Rendering an attractive and easy-to-use Web form requires more than just HTM ...
- 【Unity3D自学记录】可视化对照十多种排序算法(C#版)
在这篇文章中.我会向大家展示一些排序算法的可视化过程.我还写了一个工具.大家可对照查看某两种排序算法. 下载源代码 – 75.7 KB 下载演示样例 – 27.1 KB 引言 首先,我觉得是最重要的是 ...