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. alpha版发布

    网站网址:http://doeverying.applinzi.com/

  2. 每日Scrum(8)

    今天:在程序中嵌入剖面图,进行美化 明天:测试分析,找学弟学妹来体验我们的软件 任务看板: 燃尽图:

  3. 【Leetcode】535. Encode and Decode TinyURL

    Question: TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/pro ...

  4. Linux用户管理机制

    Linux系统中的用户管理涉及用户账号文件 /etc/passwd.用户密码文件 /etc/shadow.用户组文件 /etc/group. 一.用户账号文件 /etc/passwd 该文件为纯文本文 ...

  5. 默认css修改

    input-------------------------------------------------- .input-item input{ width: 100%; height: 60px ...

  6. .net mvc ajax 上传文件

    1.前端 <div> <input type="file" id="upfile" /> <button type="b ...

  7. 【BZOJ1303】[CQOI2009]中位数图(模拟)

    [BZOJ1303][CQOI2009]中位数图(模拟) 题面 BZOJ 洛谷 题解 把大于\(b\)的数设为\(1\),小于\(b\)的数设为\(-1\).显然询问就是有多少个横跨了\(b\)这个数 ...

  8. 网络传输---HttpURLConnection

    HttpURLConnection是java做网络传输的一种,一般用于做数据的传输如xml数据传输 1.创建及配置: 1.1创建一个url对象,并指定url的地址 URL url = new URL( ...

  9. Windows 7 安装VS2008 SP1 失败

    由于Windows 7自带了.NET Framework 3.5 SP1, 所以在安装VS 2008 SP1的时候会发生fatal error during installation的错误, 网上找来 ...

  10. Eclipse配置Maven的一些问题

    问题1:连接私服 build项目非常缓慢 配置好本地的setting文件后,发现build非常缓慢,照显示的进度,可能要一天才会build后一个项目,同事指导解决方法如下: MyEclipse2017 ...