python学习笔记-Day10--(twisted)

twisted 是一个用python实现的 基于事件驱动的网络引擎框架

twisted 包含很多功能,例如:网络协议、线程、数据库管理、网络操作、电子邮件等。


事件驱动是一种编程方式, 程序的执行过程 由外部事件来决定, 的特点是包含一个事件循环, 事件发生的时候,  使用回调机制来出发相应的处理,


事件驱动分为两部分

  1. 注册事件

  2. 触发事件


一个事件驱动框架


#!/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 -*-

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


#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
 
#!/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的处理。


参考

http://www.cnblogs.com/wupeiqi/articles/5040823.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章