• Twsited异步网络框架


    Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议、线程、数据库管理、网络操作、电子邮件等。

    事件驱动

    简而言之,事件驱动分为二个部分:第一,注册事件;第二,触发事件。

    自定义事件驱动框架,命名为:“弑君者”:

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-# event_drive.py
    event_list = []
    
    
    def run():
        for event in event_list:
            obj = event()
            obj.execute()
    
    
    class BaseHandler(object):
        """
        用户必须继承该类,从而规范所有类的方法(类似于接口的功能)
        """def execute(self):
            raise Exception('you must overwrite execute')
    复制代码

    程序员使用“弑君者框架”:

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-from source import event_drive
    
    
    class MyHandler(event_drive.BaseHandler):
    
        def execute(self):
            print 'event-drive execute MyHandler'
    
    
    event_drive.event_list.append(MyHandler)
    event_drive.run()
    复制代码

    如上述代码,事件驱动只不过是框架规定了执行顺序,程序员在使用框架时,可以向原执行顺序中注册“事件”,从而在框架执行时可以出发已注册的“事件”。

    基于事件驱动Socket

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
     
    from twisted.internet import protocol
    from twisted.internet import reactor
     
    class Echo(protocol.Protocol):
        def dataReceived(self, data):
            self.transport.write(data)
     
    def main():
        factory = protocol.ServerFactory()
        factory.protocol = Echo
     
        reactor.listenTCP(8000,factory)
        reactor.run()
     
    if __name__ == '__main__':
        main()

    程序执行流程:

    • 运行服务端程序
    • 创建Protocol的派生类Echo
    • 创建ServerFactory对象,并将Echo类封装到其protocol字段中
    • 执行reactor的 listenTCP 方法,内部使用 tcp.Port 创建socket server对象,并将该对象添加到了 reactor的set类型的字段 _read 中
    • 执行reactor的 run 方法,内部执行 while 循环,并通过 select 来监视 _read 中文件描述符是否有变化,循环中...
    • 客户端请求到达
    • 执行reactor的 _doReadOrWrite 方法,其内部通过反射调用 tcp.Port 类的 doRead 方法,内部 accept 客户端连接并创建Server对象实例(用于封装客户端socket信息)和 创建 Echo 对象实例(用于处理请求) ,然后调用 Echo 对象实例的 makeConnection 方法,创建连接。
    • 执行 tcp.Server 类的 doRead 方法,读取数据,
    • 执行 tcp.Server 类的 _dataReceived 方法,如果读取数据内容为空(关闭链接),否则,出发 Echo 的 dataReceived 方法
    • 执行 Echo 的 dataReceived 方法

    从源码可以看出,上述实例本质上使用了事件驱动的方法 和 IO多路复用的机制来进行Socket的处理。

    复制代码
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-from twisted.internet import reactor, protocol
    from twisted.web.client import getPage
    from twisted.internet import reactor
    import time
    
    class Echo(protocol.Protocol):
    
        def dataReceived(self, data):
            deferred1 = getPage('http://cnblogs.com')
            deferred1.addCallback(self.printContents)
    
            deferred2 = getPage('http://baidu.com')
            deferred2.addCallback(self.printContents)
    
            for i in range(2):
                time.sleep(1)
                print 'execute ',i
    
    
        def execute(self,data):
            self.transport.write(data)
    
        def printContents(self,content):
            print len(content),content[0:100],time.time()
    
    def main():
    
        factory = protocol.ServerFactory()
        factory.protocol = Echo
    
        reactor.listenTCP(8000,factory)
        reactor.run()
    
    if __name__ == '__main__':
        main()





  • 相关阅读:
    zookeeper 分布式锁
    mysql linux 安装
    分布式配置中心Apollo
    分布式任务调度平台xxl-job
    Java并发编程笔记之ThreadLocalRandom源码分析
    Java并发编程笔记之ThreadLocal源码分析
    SpringCloud实战10-Sleuth
    SpringCloud实战9-Stream消息驱动
    SpringCloud实战8-Bus消息总线
    SpringCloud实战7-Config分布式配置管理
  • 原文地址:https://www.cnblogs.com/bruceg/p/5314753.html
Copyright © 2020-2023  润新知