zg手冊 之 twisted 開發(1)-- twisted 框架介紹

異步非阻塞框架

twisted 是一個事件驅動的網絡開發框架,使用 python 開發。python

twisted 框架編寫的服務器有幾個基本的元素:react

  1. 應用程序對象(application):管理應用程序資源的對象,一個應用程序能夠管理多個service對象。linux

  2. 服務(service),服務對象啓動監聽的端口,服務器

  3. 協議工廠(factory):當客戶端鏈接到服務器時,用來建立協議對象。網絡

  4. 協議(protocol):每一個協議對象對應一個網絡鏈接。協議類處理網絡協議(如http,ftp,自定義協議等)app


twisted 框架內部運行依賴的元素:框架

  1. reactor:異步事件的主要循環處理類,負責監控事件,調用註冊的回調函數提供服務。(在linux上主要使用epoll/select來實現)ssh

  2. defer: 異步回調序列,當序列被執行的時候,順序執行註冊的回調函數。異步


官方的一個例子

實現一個 echo server,建立文件 echoServ.py函數

#!/usr/bin/env python
# coding: utf-8

from twisted.internet.protocol import Protocol
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor

class Echo(Protocol):
        '''協議類實現用戶的服務協議,例如 http,ftp,ssh 等'''
        def __init__(self, factory):
                self.factory = factory

        def connectionMade(self):
                '''鏈接創建時被回調的方法'''
                self.factory.numProtocols = self.factory.numProtocols + 1
                self.transport.write("Welcome! There are currently %d open connections.\n" %
                                (self.factory.numProtocols,))

        def connectionLost(self, reason):
                '''鏈接關閉時被回調的方法'''
                self.factory.numProtocols = self.factory.numProtocols - 1

        def dataReceived(self, data):
                '''接收數據的函數,當有數據到達時被回調'''
                self.transport.write(data)


class EchoFactory(Factory):
        '''協議工廠類,當客戶端創建鏈接的時候,建立協議對象,協議對象與客戶端鏈接一一對應'''
        numProtocols = 0
        def buildProtocol(self, addr):
                return Echo(self)


if __name__ == '__main__':
        # 建立監聽端口
        reactor.listenTCP(8007, EchoFactory())

        # 開始監聽事件
        reactor.run()

運行服務程序

python echoServ.py

測試服務程序

telnet 127.0.0.1 8007


例子程序的說明

  1. 協議類繼承自 twisted.internet.protocol.Protocol,需實現 dataReceived 等方法。在協議類中實現應用協議。

  2. 協議工廠繼承自 twisted.internet.protocol.Factory,需實現 buildProtocol 方法。協議工廠負責實例化協議類,不該該保存於鏈接相關的狀態信息。

  3. transport 就是鏈接對象,經過它進行網絡寫數據。


使用 daemon 的方式運行程序

使用守護進程的方式運行服務,須要提供一個 tac 配置文件(這就是一個 python 文件,只是擴展名不一樣),而且在這個文件中須要建立一個應用程序對象,對象名必須是 application。

建立一個 echo.tac 文件

#!/usr/bin/env python
# coding: utf-8

from twisted.application import service, internet
from echoServ import EchoFactory

# 建立應用程序對象
application = service.Application('Echo 服務程序')

# 建立 service 對象
myServices = internet.TCPServer(8007, EchoFactory())

# 設置 application 爲 service 的父元素
myservices.setServiceParent(application)

用守護進程方式運行服務

twistd -y echo.tac

中止服務

kill -15 pid


總結

上面就是 twisted 網絡框架編寫服務的基本方法,在框架內部有豐富的協議工廠,協議,但是很方便的實現簡單的 http,ftp,ssh 等服務器程序。

後面我會介紹一些經常使用的功能的實現原理,例如:如何記錄日誌,客戶端 http 異步請求的處理,defer 運行原理等。


原文連接: http://www.hopez.org/blog/9/1403349568

相關文章
相關標籤/搜索