Twisted学习心得(一)

一、基本概念

  • Twisted 定义:
    Twisted 是用 Python 实现的基于事件驱动的网络引擎框架。

  • 具有以下特点:
    -- 可扩展性高、基于事件驱动、跨平台。
    --Twisted 支持许多常见的传输及应用层协议,如:TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。
    --Twisted 对于其支持的所有协议都带有客户端和服务器的实现

二、Twisted架构

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

  • 模型图比较
    单线程、多线程以及事件驱动编程模型的比较

线程模型.png

注:其中灰色部分为每个任务阻塞在I/O操作上所花的 时间

从上图可以看出:

  • 单线程
    在单线程同步模型中,任务按照顺序执行。如果某个任务因为 I/O 而阻塞,其他所有的任务都必须等待,直到它完成之后它们才能依次执行。

  • 多线程
    线程由操作系统来管理,在多处理器系统上可以并行处理,或者在单处理器系统上交错执行。这使得当某个线程阻塞在某个资源的同时其他线程得以继续执行。但多线程程序难以推断,如果实现不当就会导致出现微妙且令人痛不欲生的 bug。

  • 事件驱动
    多个任务交错执行,但仍然在一个单独的线程中控制通过事件循环轮询每个事件。不需要关心线程安全问题

三、实例呈现

(1)服务器的实现
Server.py

# coding=utf-8
from twisted.internet import reactor
from twisted.internet.protocol import Protocol, Factory

class SimpleProtocol(Protocol):
    def connectionMade(self):
        """客户端连入后向客户端发送一条消息Hello"""
        print 'success from ', self.transport.client
        self.transport.write("Hello")

    def connectionLost(self, reason):
        print self.transport.client, 'disconnected'
        print reason

    def dataReceived(self, data):
        print data

factory = Factory()
factory.protocol = SimpleProtocol

# 在9001端口进行监听
reactor.listenTCP(9001, factory)
# 启动事件循环
reactor.run()

其中SimpleProtocol是我复写的一个Protocol.

(2)客户端的实现
connection.py

# coding=utf-8
from twisted.internet.protocol import ClientFactory, Protocol
from twisted.internet import reactor

class Sender(Protocol):
    def connectionMade(self):
        """连接成功后调用"""
        self.send_command()

    def send_command(self):
        """连接成功后调用他向服务端发送数据"""
        self.transport.write("hello")

    def dataReceived(self, data):
        """进行数据的接受"""
        print "DATA", data

class BasicClientFactory(ClientFactory):
    def __init__(self, protocol):
        self.protocol = protocol
          
    def clientConnectionLost(self, connector, reason):
        print 'Lost connection: %s' % reason.getErrorMessage()

PORT = 9001
HOST = '127.0.0.1'

# 实例化工厂对象
test = BasicClientFactory(Sender)
# 连接服务器
reactor.connectTCP(HOST, PORT, test)

reactor.run()

注:我复写了客户端所需要的工厂ClientFactory

(3)运行测试
先在终端上运行Server.py等待客户端的连入,然后重新开一个终端运行connection.py连接服务器。
会看到客户端和服务端各自收到了一条来自对方的hello的问候消息(如下图所示)。

服务端.png
客户端.png

四、代码原理剖析
(1)

  • Factory:
    每个服务器与客户端都会有一个工厂。他负责创建连接。并创建 protocol 对象。

  • Protocols:
    Protocols 描述了如何以异步的方式处理网络中的事件。当连接创建成功后,Factory 会创建一个 protocol, 由 protocol 进行通信。

  • Transports
    Transports 代表网络中两个通信结点之间的连接。Transports负责描述连接的细节,
    比如连接是面向流式的还是面向数据报的,流控以及可靠性。

(2)

  • Transports 实现了 ITransports 接口,它包含如下的方法:

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

  • Protocols 实现了 IProtocol 接口,它包含如下的方法:
    -- makeConnection方法: 在 transport 对象和服务器之间建立一条连接。
    -- connectionMade方法: 连接建立起来后调用。
    -- dataReceived方法: 接收数据时调用。
    -- connectionLost方法: 关闭连接时调用。

(3)

  • Reactor 模式:
    Twisted 实现了设计模式中的反应堆(reactor)模式,这种模式在单线程环境中调度多个事件源产生的事件到它们各自的事件处理例程中去。Twisted 的核心就是 reactor 事件循环。Reactor 可以感知网络、文件系统以及定时器事件。它等待然后处理这些事件。

温馨提示:

Twisted 没有直接发送数据的函数,发送数据通过Transports 中的 write 进行数据的发送。

部分文字参考http://blog.csdn.net/hanhuili/article/details/9389433

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,841评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,415评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,904评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,051评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,055评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,255评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,729评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,377评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,517评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,420评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,467评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,144评论 3 317
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,735评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,812评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,029评论 1 256
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,528评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,126评论 2 341

推荐阅读更多精彩内容