Twisted是一个事件驱动型的网络模型。时间驱动模型编程是一种范式,这里程序的执行流由外部决定。特点是:包含一个事件循环,当外部事件发生时,使用回调机制来触发相应的处理。

线程模式:

1.单线程同步模型,任务按照顺序执行。如果某个任务因为IO阻塞,其他所有的任务都必须等待,直到完成才能执行,但如果任务之间没有相互等待的话,就使得程序不必要的降低了运行速度。

2.多线程,线程是由操作系统来管理的,在多处理器系统上交错执行。这使得单个线程阻塞在某个资源的同时其他线程可以继续执行,与完成类似功能的同步程序比,这种方式更有效,但程序猿必须自己写代码保护共享资源,防止其被多个线程同时访问。多线程程序更加难以推断,因为这类程序不得不通过线程的同步机制如锁、可重入函数、线程局部存储或者其他机制来处理线程安全问题,如果实现不当就会出现bug

3.事件驱动模型中,如果有三个任务交错执行,但是仍然在一个单独的线程控制中,当处理IO或者其他昂贵的操作时,注册一个回调到事件循环中,然后当IO操作完成之后继续执行,回调描述来该如何处理某个事件,这可以使得程序尽可能的得以执行而不需要用到额外的线程,并且程序员也不需要专心线程安全问题。

Reactor模块

反应堆,Twisted的核心就是reactor的事件循环,Reactor可以感知网络、文件系统以及定时器事件。他等待然后处理这些事件,从特定的平台的行为中抽象出来,并提供统一的接口,使得在网络协议栈的任何位置对事件做出相应都变得简单。

目前的在所有平台的默认Reactor都是基于poll API的。

阻塞调用是指调用结果返回之前,当前线程会被刮起,函数只有在得到结果之后才会返回。

非阻塞调用,比如read信息,如果缓冲区没有数据,则立刻返回,不会等待数据到来。

Deferreds

Deferreds对象包含一堆回调链,一个是针对操作成功的回调,一个是针对操作失败的回调。初始常态下Deferred的两条链都是空的,在事件处理的过程中,每个阶段都为其添加处理成功和处理失败的回调。当一个异步结果到来时,Deferred对象就像是被激活,那么处理成功的回调和处理失败的回调就可以以合适的方式按照她们添加进来的顺序依次调用。

from twisted.internet import reactor
import getPage def processPage(page):
print page def logError(error):
print error def finishProcessing(value):
print "Shutting down..."
reactor.stop() url = "http://google.com"
deferred = getPage(url) # getPage returns a Deferred
deferred.addCallbacks(success, failure)
deferred.addBoth(stop) reactor.run()

Deferred对象创建时包含两个添加回调的阶段,第一阶段,addcallback将processpage和logerror添加到他们各自归属的回调链中,然后addboth再将finishprocessing同时添加到这两个回调链中。

Transports

Transports代表网络中两个通信结点之间的连接。Transports负责描述连接的细节,比如连接是面向流式的还是面向数据报的,流控以及可靠性。TCP、UDP和Unix套接字可作为transports的例子。它们被设计为“满足最小功能单元,同时具有最大程度的可复用性”,而且从协议实现中分离出来,这让许多协议可以采用相同类型的传输。Transports实现了ITransports接口,它包含如下的方法:

write                   以非阻塞的方式按顺序依次将数据写到物理连接上
writeSequence 将一个字符串列表写到物理连接上
loseConnection 将所有挂起的数据写入,然后关闭连接
getPeer 取得连接中对端的地址信息
getHost 取得连接中本端的地址信息

Protocols

Protocols描述了如何以异步的方式处理网络中的事件。

makeConnection               在transport对象和服务器之间建立一条连接
connectionMade 连接建立起来后调用
dataReceived 接收数据时调用
connectionLost 关闭连接时调用

Service

Service就是IService接口下实现的可以启动和停止的组件。Twisted自带有TCP、FTP、HTTP、SSH、DNS等服务以及其他协议的实现。其中许多Service都可以注册到单独的应用中。IService接口的核心是:

startService    启动服务。可能包含加载配置数据,设定数据库连接或者监听某个端口
stopService 关闭服务。可能包含将状态保存到磁盘,关闭数据库连接或者停止监听端口

我们的Echo服务使用TCP协议,因此我们可以使用Twisted中IService接口下默认的TCPServer实现。

Application

Application是处于最顶层的Service,代表了整个Twisted应用程序。Service需要将其自身同Application注册,然后就可以用下面我们将介绍的部署工具twistd搜索并运行应用程序。我们将创建一个可以同Echo Service注册的Echo应用。

Twisted框架的更多相关文章

  1. Twisted 框架 初印象

    上面是twisted官网推荐的书籍,从封面可以看到,是一堆大蟒(python)纠缠在一起,这里可以说明twisted是一个基于pyhton语言,支持各种网络协议(包括UDP,TCP,TLS和其他应用层 ...

  2. twisted框架的使用和应用?

    https://www.cnblogs.com/zhiyong-ITNote/archive/2017/08/14/7360442.html twisted网络框架的三个基础模块:Protocol, ...

  3. Twisted框架学习

    Twisted是用Python实现的基于事件驱动的网络引擎框架,是python中一个强大的异步IO库.理解twisted的一个前提是弄清楚twisted中几个核心的概念: reactor, Proto ...

  4. Python——Twisted框架(网络通信)

    一.简介 twisted是一个封装好的网络通信的库,可以帮助我们快速进行网络编程.注意,python3中,字符串必须转码成utf8的格式,否则无法发送.比如str("test"). ...

  5. Python - twisted web 入门学习之一

    原文地址:http://zhouzhk.iteye.com/blog/765884 python的twisted框架中带了一个web server: twisted web.现在看看怎么用. 一)准备 ...

  6. Pyhton开源框架(加强版)

    info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...

  7. Python开源框架

    info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...

  8. Twisted网络编程入门

    Twisted是用Python实现的基于事件驱动的网络引擎框架,功能非常丰富,基本包括了常用的网络组件. 所谓事件驱动,就是说程序就像是一个报警器(reactor),时刻等待着外部事件(event), ...

  9. 【转】Python Twisted介绍

    Python Twisted介绍 作者:Jessica McKellar 原文链接 Twisted是用Python实现的基于事件驱动的网络引擎框架.Twisted诞生于2000年初,在当时的网络游戏开 ...

随机推荐

  1. 《Linux内核分析》 第三周 构造一个简单的Linux系统MenuOS

    Linux内核分析 第三周 构造一个简单的Linux系统MenuOS 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...

  2. 《Linux内核设计与实现》读书笔记——第一、 二章

    <Linux内核设计与实现>读书笔记--第一. 二章 标签(空格分隔): 20135321余佳源 第一章 Linux内核简介 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确 ...

  3. 第二阶段冲刺——five

    个人任务: 王金萱:合并程序(统计团队博客). 季方:合并并排除运行团队博客时出现的错误. 马佳慧:优化登录.注册信息的填写判断. 司宇航:完成打印名单的功能. 站立会议: 任务看板和燃尽图:

  4. (改进)Python语言实现词频统计

    需求: 1.设计一个词频统计的程序. 2.英语文章中包含的英语标点符号不计入统计. 3.将统计结果按照单词的出现频率由大到小进行排序. 设计: 1.基本功能和用法会在程序中进行提示. 2.原理是利用分 ...

  5. d3 选择器

    一.隔了一段时间没看D3了,好多api又陌生了.武林太大,唯有自强不息. D3 选择器算是学习D3的第一步吧. 跟 学习JQ一样.先熟悉下api,才能够如鱼得水,手到勤来. 二. 选择器 1.选择器 ...

  6. 部分机器进入bios 的 方法

  7. Yii 框架的Rbac [权限控制]

    转载自 xmlife 的博客 : http://blog.csdn.net/xmlife/article/details/50733451 1.首先我们要在配置文件的组件(component)里面配置 ...

  8. delphi JPG或BMP图片透明显示

    procedure SaveBmpAsIcon(const Bmp: TBitmap; const Icon: string; const SmallIcon: Boolean; const Tran ...

  9. MySQL查询where条件的顺序对查询效率的影响

    看到有资料说,where条件的顺序会影响查询的效率,根据的逻辑是: where条件的运行是从右到左的,将选择性强的条件放到最右边,可以先过滤掉大部分的数据(而选择性不强的条件过滤后的结果集仍然很大), ...

  10. 模拟事件【JavaScript高级程序设计第三版】

    事件,就是网页中某个特别值得关注的瞬间.事件经常由用户操作或通过其他浏览器功能来触发.但很少有人知道,也可以使用JavaScript 在任意时刻来触发特定的事件,而此时的事件就如同浏览器创建的事件一样 ...