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. Hamburger

    Bread: 我觉得舒婷解决问题的思路还是很不错的,对于java 的窗口框架也是很熟悉,打码速度也快了很多. Meat:但是我发现你在命名的时候会出现随意的现象,如果命名只有你自己看得懂的话,那么会增 ...

  2. PAT 1048 数字加密

    https://pintia.cn/problem-sets/994805260223102976/problems/994805276438282240 本题要求实现一种数字加密方法.首先固定一个加 ...

  3. [财务知识]IFRS9

    浅谈IFRS9 2018-07-10 23:15信用/收益 原创申明 本文原创作者为金融监管研究院助理研究员李健,未经授权谢绝转载.引用.抄袭. 引言 2018年6月6日,财政部会计司发布了“关于就& ...

  4. CentOS 安装 Harbor的简单过程(仅使用http 未使用https)

    1. 下载离线安装包 在线安装 99% 会失败, 建议还是使用离线安装包 下载地址 https://github.com/vmware/harbor/releases 20180719 时最新版本的g ...

  5. 【大数据】SparkSql学习笔记

    第1章 Spark SQL概述 1.1 什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了2个编程抽象:DataFrame和 DataSet,并且作为分布式 ...

  6. c# DataGridView绑定DataTable对象之后总会多一行

    DataGridView 属性 AllowUserToAddRows = false

  7. bzoj1008/luogu3197 越狱 (快速幂)

    算$m^n-m*(m-1)^{n-1}$,就是总的减去不越狱的,不越狱就每次都选一个和上一个不一样的

  8. 内置函数sorted()

    这里顺便说一下sorted()和sort()的异同. sort 是 list 中的方法,只能对列表排序:sorted 可以对所有可迭代对象进行排序. list 的 sort 方法是对原列表进行操作,而 ...

  9. IntelliJ IDEA 创建Java Web项目

    1. 创建Web项目 可以先阅读 IntelliJ IDEA 的安装和使用教程 注意:IntelliJ IDEA 中 Project 和 Module 的概念及区别 创建完成后点击Import Cha ...

  10. 《剑指offer》— JavaScript(31)整数中1出现的次数(从1到n整数中1出现的次数)

    整数中1出现的次数(从1到n整数中1出现的次数) 题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12 ...