Twisted

Twisted定义

Twisted是一个基于事件驱动的网络引擎框架

网络框架,别人预先定义好的一个框架(一个项目),如.net某个web框架有25个class,从BeginRequest依次执行类里的process方法,程序员自己定义一个类,添加到框架里,应用程序从上到下运行,就会执行自定义代码。框架只知道这个类的列表,不关心你写了什么内容,从上到下执行,类似于一个执行链,C#里叫委托链。也就是把代码类放到这个列表中,委托这个框架替你执行。

事件驱动(not event),把自定义代码注册到框架中,框架代替你执行。或者框架提供几个接口,让你插入数据(python里没有 )。

委托不能为空,事件可以为空。

演示一个最简单的框架

前期准备:

新建一个名为event_drive的python package,里面新建一个event_drive.py文件,这个就是框架主文件,把package目录复制到sys.path中,如:c:\python27\lib\site-package\

event_drive.py:

1

2

3

4

5

6

7

8

9

10

11

12

13

event_list = []    #[myclass,]

def run():

    for event in event_list:

        obj = event()

        obj.execute()

class BaseHandler(object):

    """

    用户必须继承该类,从而规范所有类的方法(类似于接口的功能)

    """

    def execute(self):

        raise Exception(‘you must overwrite execute‘)

自定义代码:

1

2

3

4

5

6

7

8

9

from event_drive import event_drive

class MyClass(event_drive.BaseHandler):

    def execute(self):  #重写execute方法

        print "执行了自定义execute方法"

event_drive.event_list.append(MyClass)  #注册到委托链即“注册一个事件”

event_drive.run()

执行过程:
  1. 导入event_drive文件夹中的event_drive文件
  2. 自定义一个类MyClass,这个类继承了event_drive文件中BaseHandler类
  3. 类里实现execute方法,内容无所谓甚至可以为空,方法名称execute不能改变
  4. 注册事件到框架的委托链,即把类名list.append(MyClass)传进去(下面的Twisted框架是创建对象后改一个字段为类名也是同样的目的)
  5. 执行run方法,框架自己就把MyClass中的方法执行了
执行结果:

1

2

执行了自定义execute方法

Process finished with exit code 0

Twisted框架:以socket为例

安装Twisted:(linux参考如下,windows直接用安装包)

1

2

3

cd Twisted-15.5.0

python setup.py build

python setup.py install

ps:twisted调用了zope和win32api模块,先安装这两个,要不会报错。

Twisted_server.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

from twisted.internet import reactor, protocol

from twisted.web.client import getPage

from twisted.internet import reactor

import time

class Echo(protocol.Protocol):    #继承protocol.py中的Protocol类

    def dataReceived(self, data):    

        self.transport.write(data)    #将收到的内容直接发送回去

factory = protocol.ServerFactory()    #实例化

factory.protocol = Echo    #将自定义类传给对象

reactor.listenTCP(8000,factory)    #将端口和实例化对象作为参数传给reactor

reactor.run()

Twisted_client.py

1

2

3

4

5

6

7

8

9

10

11

12

import socket

ip_port=(‘127.0.0.1‘,8000)

sk=socket.socket()

sk.connect(ip_port)

sk.settimeout(5)

while True:

    inp=raw_input("please input:")

    sk.sendall(inp)

    print sk.recv(1024)

sk.close()

执行原理

跟SocketServer原理类似,内部封装,内部有一个while循环,while循环一旦触发,找到这个类,执行这个类的构造方法,创建对象,通过对象,执行预定义的方法,

源码分析

程序执行流程:

  • 运行服务端程序
  • 创建Protocol的派生类Echo

    解释:自定义Echo类,名字随便起,它继承了Protocol类,Protocol类又继承了BaseProtocol类,有了最左边的图

  • 创建ServerFactory对象,并将Echo类封装到其protocol字段中

    解释:ServerSocket是将MyClass以参数的形式封装,这个是以字段的形式

  • 执行reactor的 listenTCP 方法,内部使用 tcp.Port 创建socket server对象,并将该对象添加到了 reactor的set类型的字段 _read 中

    解释:

    1. print type(reactor)
    2. ==>
    3. <class ‘twisted.internet.selectreactor.SelectReactor‘>

    去selectreactor.SelectReactor中找listenTCP,看上面的类继承关系图,继承了好多类。listenTCP和run方法都在基类里。

    1. def listenTCP(self, port, factory, backlog=50, interface=‘‘):
    2. p = tcp.Port(port, factory, backlog, interface, self)
    3. p.startListening()
    4. return p

    其中把factory对象传入,就相当于:

    1、把Echo类封装到factory字段

    2、再把factory对象封装到listenTCP

    3、tcp.port里创建了socket连接

  • 执行reactor的 run 方法,内部执行 while 循环,并通过 select 来监视 _read 中文件描述符是否有变化,循环中...

解释:SelectReactor中包含两个集合_reads=set()和_writes=set(),不允许重复的集合,有连接后把文件句柄添加到这个集合中。开始执行reactor.run(),它调用基类里的mainLoop方法,又调取的selectreactor.doInteration,找不到?因为它是个重命名doInteration=doSelect,这个方法里面调取的就是select方法,通过调用select,循环这个_reads。一旦有句柄进来,通过反射去_reads里找“doRead”执行方法。

  • 客户端请求到达

解释:可以通过debug方式了解调用顺序

  • 执行reactor的 _doReadOrWrite 方法,其内部通过反射调用 tcp.Port 类的 doRead 方法,内部 accept 客户端连接并创建Server对象实例(用于封装客户端socket信息)和 创建 Echo 对象实例(用于处理请求) ,然后调用 Echo 对象实例的 makeConnection 方法,创建连接。
  • 执行 tcp.Server 类的 doRead 方法,读取数据,
  • 执行 tcp.Server 类的 _dataReceived 方法,如果读取数据内容为空(关闭链接),否则,触发Echo 的 dataReceived 方法
  • 执行 Echo 的 dataReceived 方法

功能

Twisted主要用于网络操作,它支持许多常见的传输及应用层协议,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。其中包含了诸多功能,例如:网络协议、线程、数据库管理、网络操作、电子邮件等。

优点

  • 使用基于事件驱动的编程模型,而不是多线程模型。
  • 跨平台:为主流操作系统平台暴露出的事件通知系统提供统一的接口。
  • “内置电池”的能力:提供流行的应用层协议实现,因此Twisted马上就可为开发人员所用。
  • 符合RFC规范,已经通过健壮的测试套件证明了其一致性。
  • 能很容易的配合多个网络协议一起使用。
  • 可扩展。

一个非常全面介绍Twisted网站

http://twisted.readthedocs.org/en/twisted-15.5.0/

来自为知笔记(Wiz)

时间: 2024-10-20 20:32:03

Twisted的相关文章

Python Twisted网络编程框架与异步编程入门教程

原作出处:twisted-intro-cn 作者:Dave 译者:杨晓伟 luocheng likebeta 转载声明:版权归原作出处所有,转载只为让更多人看到这部优秀作品合集,如果侵权,请留言告知 感 谢:感谢 杨晓伟 luocheng likebeta 为国内Twisted Coder做的里程碑级贡献 其 它:能访问到Github的童鞋,请访问出处链接.因为出处排版相当棒! 1.Twisted理论基础 2.异步编程初探与reactor模式 3.初次认识Twisted 4.由twisted支持

深入学习twisted(基础)二

上一篇对twisted大致做了介绍以及一些基本的概念. 这一篇从一个python epoll/soket聊天程序开始. 我们要实现的很简单,就是利用epoll实现一个服务端/客户端间的聊天,服务端和客户端可以接收消息的同时,可以利用raw_input,在命令行输入. 我们将socket fd设置为非阻塞的,但是我们知道标准的输入输出io都是阻塞的,我们就开辟一个线程专门处理输入,在主线程进行消息的收发.这样当我们没有输入的时候,raw_input就会阻塞,由我们的主线程进行监听和处理.代码如下:

twisted 6 大话deferred

http://twistedsphinx.funsize.net/projects/core/howto/deferredindepth.html 1. 没有等待,就没有事件.设备的"监听"功能是一切事件的来源. 一句话道明deferred的精髓 Normally, a function would create a deferred and hand it back to you when you request an operation that needs to wait for

python 网络框架twisted基础学习及详细讲解

twisted网络框架的三个基础模块:Protocol, ProtocolFactory, Transport.这三个模块是构成twisted服务器端与客户端程序的基本. Protocol:Protocol对象实现协议内容,即通信的内容协议ProtocolFactory: 是工厂模式的体现,在这里面生成协议Transport: 是用来收发数据,服务器端与客户端的数据收发与处理都是基于这个模块 在windows中安装twisted需要先安装pywin32,自己去下载下就行.随后pip instal

python_如何通过twisted实现数据库异步插入?

如何通过twisted实现数据库异步插入? 1. 导入adbapi 2. 生成数据库连接池 3. 执行数据数据库插入操作 4. 打印错误信息,并排错 #!/usr/bin/python3 import pymysql from twisted.enterprise import adbapi from twisted.internet import reactor def go_insert(cursor, sql): # 对数据库进行插入操作,并不需要commit,twisted会自动帮我co

Python Twisted架构英文版

原作出处:twisted-intro 作者:Dave 转载声明:版权归原作出处所有,转载只为让更多人看到这部优秀作品合集,如果侵权,请留言告知 Twisted Introduction This multi-part series introduces Asynchronous Programming and the Twisted networking framework. In Which We Begin at the Beginning Slow Poetry and the Apoca

flask twisted 结合方案

from flask import Flask, render_template, g app = Flask(__name__) @app.route("/") def index(): return render_template("index.html") # run in under twisted through wsgi from twisted.web.wsgi import WSGIResource from twisted.web.server i

tornado+ansible+twisted+mongodb运维自动化系统开发(一)

前段时间学习了一下ansible的配置管理(http://blog.csdn.net/column/details/ansible.html   anisble配置工具翻译专栏),感觉很强大,就想着把最近看的tornado和twisted和它结合一下做一个webUI 今天动手做了一个demo,目前大概实现的功能是:添加ansible主机,然后单台运行脚本(后续会把playbook和批量运行加上)在这里做一下记录. 用freemind总结了下思路 下面是demo的截图 添加主机,后台完成清单目录的

python之twisted模块安装

Twisted是一个事件驱动的网络框架. 最近开始学习了解Twisted,首先肯定要安装twisted模块. 但是在cmd下执行:pip install twisted 出现了下面的问题:"error:Microsoft Visual C++ 10.0 is required (Unable to find vcvarsall.bat) 我电脑是pyhton3.4环境(python2.7也有),没有装VC++ 10.0,所以根据error提示,我得去装个VC++ 10.0?? 但是我并不想~,于

为什么 Node.js 这么火,而同样异步模式 Python 框架 Twisted 却十几年一直不温不火?

twisted是一个强大的异步网络框架,应用的面也非常广,但是没有这几年才出现的Node.js火,社区.文档也是很少可怜我觉得二者其实在本质上差不多,而且python使用起来还是比较容易一些的 匿名用户 因为,它给了一大部分程序猿幻觉比如前后端统一,脚本也能性能很屌,做Demo搜搜快什么的,但实际上,这仅仅是幻觉罢了…… 正是因为这样的幻觉是“看得到”的,又有一个响当当的干爹Google,因此Node的曝光率远高于后端常规语言就不足为奇了. 论速度,你一个带JIT的跟常规脚本语言的虚拟机比,没到