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