Twisted

Twisted定義

? ??Twisted是一個基于事件驅動的網絡引擎框架

? ? ?網絡框架,別人預先定義好的一個框架(一個項目),如.net某個web框架有25個class,從BeginRequest依次執行類里的process方法,程序員自己定義一個類,添加到框架里,應用程序從上到下運行,就會執行自定義代碼。框架只知道這個類的列表,不關心你寫了什么內容,從上到下執行,類似于一個執行鏈,C#里叫委托鏈。也就是把代碼類放到這個列表中,委托這個框架替你執行。

? ? 事件驅動(not event),把自定義代碼注冊到框架中,框架代替你執行。或者框架提供幾個接口,讓你插入數據(python里沒有 )。

????委托不能為空,事件可以為空。

演示一個最簡單的框架

前期準備:

? ? ?新建一個名為event_drive的python package,里面新建一個event_drive.py文件,這個就是框架主文件,把package目錄復制到sys.path中,如:c:\python27\lib\site-package\

event_drive.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
event_list = [] ? ?#[myclass,]
def run():
????for event in event_list:
????????obj = event()
????????obj.execute()
class BaseHandler(object):
????"""
????用戶必須繼承該類,從而規范所有類的方法(類似于接口的功能)
????"""
????def execute(self):
????????raise Exception('you must overwrite execute')
自定義代碼:
1
2
3
4
5
6
7
8
9
from event_drive import event_drive
class MyClass(event_drive.BaseHandler):
????def execute(self):? #重寫execute方法
????????print "執行了自定義execute方法"
event_drive.event_list.append(MyClass)? #注冊到委托鏈即“注冊一個事件”
event_drive.run()
執行過程: ? ?
  1. 導入event_drive文件夾中的event_drive文件

  2. 自定義一個類MyClass,這個類繼承了event_drive文件中BaseHandler類

  3. 類里實現execute方法,內容無所謂甚至可以為空,方法名稱execute不能改變

  4. 注冊事件到框架的委托鏈,即把類名list.append(MyClass)傳進去(下面的Twisted框架是創建對象后改一個字段為類名也是同樣的目的)

  5. 執行run方法,框架自己就把MyClass中的方法執行了

執行結果:
1
2
執行了自定義execute方法
Process finished with exit code 0

Twisted框架:以socket為例

安裝Twisted:(linux參考如下,windows直接用安裝包)

1
2
3
cd Twisted-15.5.0
python setup.py build
python setup.py install

? ? ps:twisted調用了zope和win32api模塊,先安裝這兩個,要不會報錯。

Twisted_server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from twisted.internet import reactor, protocol
from twisted.web.client import getPage
from twisted.internet import reactor
import time
class Echo(protocol.Protocol): ? ?#繼承protocol.py中的Protocol類
????def dataReceived(self, data): ? ?
????????self.transport.write(data) ? ?#將收到的內容直接發送回去
factory = protocol.ServerFactory() ? ?#實例化
factory.protocol = Echo ? ?#將自定義類傳給對象
reactor.listenTCP(8000,factory) ? ?#將端口和實例化對象作為參數傳給reactor
reactor.run()
Twisted_client.py
1
2
3
4
5
6
7
8
9
10
11
12
import socket
ip_port=('127.0.0.1',8000)
sk=socket.socket()
sk.connect(ip_port)
sk.settimeout(5)
while True:
????inp=raw_input("please input:")
????sk.sendall(inp)
????print sk.recv(1024)
sk.close()

執行原理

? ? 跟SocketServer原理類似,內部封裝,內部有一個while循環,while循環一旦觸發,找到這個類,執行這個類的構造方法,創建對象,通過對象,執行預定義的方法,

源碼分析

827870-20151231113942745-225175241.png

程序執行流程:

  • 運行服務端程序
  • 創建Protocol的派生類Echo

    ? ? 解釋:自定義Echo類,名字隨便起,它繼承了Protocol類,Protocol類又繼承了BaseProtocol類,有了最左邊的圖

  • 創建ServerFactory對象,并將Echo類封裝到其protocol字段

    ? ? 解釋:ServerSocket是將MyClass以參數的形式封裝,這個是以字段的形式

  • 執行reactor的 listenTCP 方法,內部使用?tcp.Port 創建socket server對象,并將該對象添加到了 reactor的set類型的字段 _read 中

    ? ? 解釋:

    1. print type(reactor)
    2. ==>
    3. <class 'twisted.internet.selectreactor.SelectReactor'>

    去selectreactor.SelectReactor中找listenTCP,看上面的類繼承關系圖,繼承了好多類。listenTCP和run方法都在基類里。

    1. def listenTCP(self, port, factory, backlog=50, interface=''):
    2. p = tcp.Port(port, factory, backlog, interface, self)
    3. p.startListening()
    4. return p
    其中把factory對象傳入,就相當于:
    1、把Echo類封裝到factory字段
    2、再把factory對象封裝到listenTCP
    3、tcp.port里創建了socket連接
  • 執行reactor的 run 方法,內部執行 while 循環,并通過 select 來監視?_read 中文件描述符是否有變化,循環中...

? ? 解釋:SelectReactor中包含兩個集合_reads=set()和_writes=set(),不允許重復的集合,有連接后把文件句柄添加到這個集合中。開始執行reactor.run(),它調用基類里的mainLoop方法,又調取的selectreactor.doInteration,找不到?因為它是個重命名doInteration=doSelect,這個方法里面調取的就是select方法,通過調用select,循環這個_reads。一旦有句柄進來,通過反射去_reads里找“doRead”執行方法。

  • 客戶端請求到達

? ? ? ? ?解釋:可以通過debug方式了解調用順序827870-20151231113943464-1711491019.png

  • 執行reactor的?_doReadOrWrite 方法,其內部通過反射調用 tcp.Port 類的?doRead 方法,內部 accept 客戶端連接并創建Server對象實例(用于封裝客戶端socket信息)和?創建 Echo 對象實例(用于處理請求)?,然后調用 Echo 對象實例的?makeConnection 方法,創建連接。
  • 執行 tcp.Server 類的?doRead 方法,讀取數據,
  • 執行 tcp.Server 類的?_dataReceived 方法,如果讀取數據內容為空(關閉鏈接),否則,觸發Echo 的?dataReceived 方法
  • 執行?Echo 的?dataReceived 方法

????Twisted主要用于網絡操作,它支持許多常見的傳輸及應用層協議,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。其中包含了諸多功能,例如:網絡協議、線程、數據庫管理、網絡操作、電子郵件等。

827870-20151231113943917-1187297821.png

優點

  • 使用基于事件驅動的編程模型,而不是多線程模型。

  • 跨平臺:為主流操作系統平臺暴露出的事件通知系統提供統一的接口。

  • “內置電池”的能力:提供流行的應用層協議實現,因此Twisted馬上就可為開發人員所用。

  • 符合RFC規范,已經通過健壯的測試套件證明了其一致性。

  • 能很容易的配合多個網絡協議一起使用。

  • 可擴展。

一個非常全面介紹Twisted網站

? ??http://twisted.readthedocs.org/en/twisted-15.5.0/














來自為知筆記(Wiz)


轉載于:https://www.cnblogs.com/daliangtou/p/5091226.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373878.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373878.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373878.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從Spring到Java EE 6

我最近在一個非常復雜的項目中工作&#xff0c;其中融合了許多Java EE 6技術&#xff08;例如JPA&#xff0c;JAXB&#xff0c;JMS&#xff0c;JTA&#xff0c;JAX-RS等&#xff09;。 出于生產力和計劃方面的原因&#xff0c;將原型應用程序設計為獨立的純Spring應用程序。 當…

Centos 6.5 搭建php環境(nginx+mariadb+php7)

1.mariaDb vim /etc/yum.repos.d/MariaDB.repo [mariadb] name MariaDB baseurl http://yum.mariadb.org/5.5/centos5-x86 gpgkeyhttps://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck1#如果服務器已經安裝了MariaDB-Galera-server包&#xff0c;你可能需要在安裝MariaDB-s…

MAC itunes無法驗證服務器s.mzstatic/itunes無法更新服務器解決方案

打開host文件&#xff1a; 一、用終端打開&#xff1a; sudo vi /etc/hosts 輸入完這行命令后需要輸入電腦密碼&#xff0c;然后確認&#xff0c;進入host文件 然后按i鍵進入編輯模式&#xff0c;在最后一行添加&#xff1a;23.214.233.166 s.mzstatic.com 如下圖 添加完后&…

硬幣問題——固定終點的最長路和最短路

問題描述&#xff1a; 有n種硬幣&#xff0c;面值分別為V1,V2...,Vn,每種都有無限多。給定非負整數S&#xff0c;可以選用多少個硬幣&#xff0c;使得面值之和恰好為S&#xff1f;輸出硬幣數目的最小值和最大值。0 < n < 100, 0 < S < 10000, 1 < Vi < S。 …

讀取nas_NAS怎么玩?除了存放小姐姐,它竟然還有這些功能

自從有了電腦&#xff0c;就一直在折騰"存儲那點事兒"&#xff0c;說到底&#xff0c;電腦的本質就是存儲&#xff0c;而自己弄家用存儲方面的東西算下來也有幾年了。單機的硬盤存儲比較簡單&#xff0c;但是隨著家里各種設備的增多&#xff0c;各個設備間的文件共享…

ZK Web框架思想

我曾多次被要求提出一些有關ZK的意見。 因此&#xff0c;根據我作為ZK用戶4年的經驗&#xff0c;以下是一些想法&#xff1a; 總體開發人員經驗&#xff0c;社區和文檔 “就是這樣” ZK提供的大多數東西都能很好地工作&#xff0c;并且如果您以前開發過任何桌面Java應用程序&…

OC第一講:類和對象

今天終于開始進行OC的學習了 一.首先講了NSLog NSLog是oc里面的輸出語句&#xff0c;其用法和printf差不多&#xff0c;但是還是有差別的 1&#xff0c;NSLog是自動換行的&#xff0c;不用像printf那樣還需要加\n&#xff1b; 2&#xff0c;NSLog在引號面前需要添加符號&#x…

【轉載】關于 Google Chrome 中的全屏模式和 APP 模式

【來源于】新浪微博&#xff1a;阿博 http://www.cnblogs.com/abel/p/3235839.html 全屏模式&#xff1a;kiosk 默認全屏打開一個網頁呢&#xff0c;只需要在快捷方式中加上 --kiosk [url] 就可以了。 關于全屏模式&#xff1a; 1、全屏模式下&#xff0c;廣告插件&#xff08;…

PL/SQL Developer跑在Oracle 64位數據庫上初始化錯誤

安裝完Oracle(64位)、PL/SQL Developer后運行PL/SQL出現如下的錯誤&#xff1a; 網上查資料說&#xff0c;我的PL/SQL Developer與ORACLE不兼容&#xff0c;即PL/SQL不支持64位的ORACLE&#xff0c;因此得下一個32位的ORCALE客戶端并配置相應的參數&#xff1a; 解決步驟小記&a…

gis 聯合 融合_GIS技術進化 | 我們為何需要跨平臺GIS技術體系?

10月30日&#xff0c;超圖在2019 GIS 軟件技術大會上發布了SuperMap GIS 10i系列產品。SuperMap GIS 10i全面融入人工智能(AI)技術&#xff0c;創新并構建了GIS基礎軟件“BitCC”五大技術體系&#xff0c;即大數據GIS、人工智能GIS、新一代三維GIS、云原生GIS和跨平臺GIS&#…

Spring陷阱:代理

作為Spring框架的用戶和發燒友多年&#xff0c;我遇到了一些關于此堆棧的誤解和問題。 另外&#xff0c;在某些地方抽象非常可怕地泄漏&#xff0c;以便有效&#xff0c;安全地利用開發人員需要意識到的所有功能。 這就是為什么我開始Spring陷阱系列的原因。 在第一部分中&…

UVa11925 Generating Premutations

留坑(p.254) 1 #include<cstdio>2 #include<cstring>3 #include<cstdlib>4 #include<algorithm>5 #include<iostream>6 7 using namespace std;8 9 void setIO(const string& s) { 10 freopen((s ".in").c_str(), "r&qu…

xamarin UWP中MessageDialog與ContentDialog的區別

MessageDialog與ContentDialog的異同點解析&#xff1a; 相同點一&#xff1a;都是uwp應用上的一個彈窗控件。都能做為彈出應用。 相異點一&#xff1a;所在命名空間不同&#xff0c;MessageDialog在Windows.UI.Popups.MessageDialog下&#xff0c;而ContentDialog在Windows.UI…

python篩選大量數據_python(數據篩選)

在Python3中&#xff1a;(1)xrange的功能合并到range里面&#xff0c;xrange已經不存在 -> range和xrange用法(2)filter已經不能返回一個list&#xff0c;而是只能返回一個迭代對象&#xff0c;需要套在一個list()里面&#xff0c;且&#xff0c;需要注意的是&#xff0c;fi…

ORA-12514: TNS: 監聽程序當前無法識別連接描述符中請求的服務

不指定數據庫可以正常連接&#xff1a; 指定數據庫和使用PL/SQL Developer都出現錯誤&#xff1a; 在此說明一下我的環境&#xff1a;Oralce裝的是64位的在使用PL/SQL Developer時曾出現過初始化錯誤&#xff0c;解決辦法就是下載oracle 32位客戶端并相應的配置。 解決方案一&a…

Devoxx 2011印象

Devoxx 2011結束了&#xff0c;它很棒。 最終&#xff0c;在不得不與妻子和孩子度過周末之后&#xff08;上個星期我很少見過&#xff09;&#xff0c;我找到了寫下一些東西的時間。 對我來說&#xff0c;這是第六個Devoxx&#xff0c;我的第一個是2006年-那時我還是一個學生&a…

Ubuntu14.04.3,apt-get出現dpkg: error processing package xxx (--configure)和cups-daemon錯誤的解決方案...

Ubuntu14.04.3&#xff0c;使用apt-get安裝軟件的時候&#xff0c;報個莫名其妙的錯誤&#xff1a; dpkg: error processing package xxx (--configure): balabala...Errors were encountered while processing: cups-daemon cups-core-drivers cups E: Sub-process /usr/bin/d…

實驗三 類的繼承和多態性

實驗三 類的繼承和多態性 1.(1)編寫一個接口ShapePara&#xff0c;要求&#xff1a; 接口中的方法&#xff1a; int getArea()&#xff1a;獲得圖形的面積。int getCircumference()&#xff1a;獲得圖形的周長 (2)編寫一個圓類Circle&#xff0c;要求&#xff1a;圓類Circle實現…

ORA-01843:無效的月份

Oracle數據庫默認情況下&#xff0c;會以DD-MON-YY的形式顯示日期&#xff0c;其中DD是天數&#xff0c;MON是月份的前三個字母&#xff08;大寫&#xff09;&#xff0c;而YY是年份的最后兩位。數據庫實際上會為年份存儲4位數字&#xff0c;但是默認情況下只會顯示最后兩位。 …

貪心策略取得最優解的條件_什么是貪心算法?

一、什么是貪心算法貪心算法是指&#xff0c;在對問題求解時&#xff0c;總是做出在當前看來是最好的選擇。(局部最優解&#xff0c;而不是整體最優解)貪心算法沒有固定的算法框架&#xff0c;算法設計的關鍵是貪心策略的選擇。必須注意的是&#xff0c;貪心算法不是對所有問題…