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


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