twisted 是一个用python实现的 基于事件驱动的网络引擎框架
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 -*-
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