學習twisted_1 基本

前言

也玩了蠻久的scrapy了浦旱,scrapy底層用到的twisted還是要學習一下的您访,了解原理能提高自己的技術水平的說

異步編程

如果在某程序的運行時透硝,能根據(jù)已經(jīng)執(zhí)行的指令準確判斷它接下來要進行哪個具體操作膀估,那它是同步程序棠众,反之則為異步程序撰豺。(無序與有序的區(qū)別)
大部分編程語言中對方法的調用是同步執(zhí)行的粪般。例如在線程執(zhí)行體內,即線程的調用函數(shù)中污桦,方法的調用就是同步執(zhí)行的亩歹。如果方法需要很長的時間來完成,比方說從Internet加載數(shù)據(jù)的方法凡橱,調用者線程將被阻塞直到方法調用完成小作。如果不希望調用被阻塞,異步方法調用 它通過使用一種立即返回的異步的變量方法并提供額外的方法來支持接受完成通知以及完成等待 以優(yōu)化改進長期運行的(同步)方法稼钩。

反應器模式 reactor pattern

反應器模式是一種為處理服務請求并發(fā)提交到一個或者多個服務處理程序的事件設計模式顾稀。當請求抵達后,服務處理程序使用解多路分配策略坝撑,然后同步地派發(fā)這些請求至相關的請求處理程序
看英文版意思可能更清楚點
The reactor design pattern "Design pattern (computer science)") is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to the associated request handlers.
反應器模式一定至少有一個在一直循環(huán)處理傳入事件的loop

loop

基本使用

原理上的東西在寫的時候可能更好的理解静秆,先寫個簡單的程序吧

from twisted.internet import reactor

reactor.run()

twisted 就是一個反應堆模式,reactor是事件循環(huán)巡李,而這正是twisted的核心抚笔,從文檔和一些資料中我們知道

1.Twisted的reactor只有通過調用reactor.run()來啟動。

2.reactor循環(huán)是在其開始的進程中運行侨拦,上面的代碼也就是運行在主進程中殊橙。

3.一旦啟動,就會一直運行下去。reactor就會在程序的控制下(或者具體在一個啟動它的線程的控制下)膨蛮。

4.reactor循環(huán)并不會消耗任何CPU的資源叠纹。

5.并不需要顯式的創(chuàng)建reactor,只需要引入就OK了敞葛。

最后一條需要解釋清楚誉察。在Twisted中,reactor是單例模式制肮,即在一個程序中只能有一個reactor冒窍,并且只要你引入它就相應地創(chuàng)建一個。

接下來就可以跑一個twisted的hello world

from twisted.internet import reactor

def hello():
    print("hello world")

reactor.callWhenRunning(hello)
reactor.run()

hello 方法就是我們說的回調方法了豺鼻,reactor 不需要知道回調方法的細節(jié)综液,只需要知道是哪個回調方法

1.reactor模式是單線程的。

2.像Twisted這種交互式模型已經(jīng)實現(xiàn)了reactor循環(huán)儒飒,意味無需我們親自去實現(xiàn)它谬莹。

3.我們仍然需要框架來調用我們自己的代碼來完成業(yè)務邏輯。

4.因為在單線程中運行桩了,要想跑我們自己的代碼附帽,必須在reactor循>環(huán)中調用它們。

5.reactor事先并不知道調用我們代碼的哪個函數(shù)

reactor 和我們自己的代碼出了注冊回調外井誉,應該是毫無耦合

接下來寫一個定時關閉reactor的例子

from twisted.internet import reactor

def hello():
    print("hello world")
    
def count(i):
    print(i)
    if i==5:
        reactor.stop()
    else:
        reactor.callLater(1,count,i+1)
        
reactor.callWhenRunning(hello)
reactor.callWhenRunning(count,1)
reactor.run()
print("reactor down")

上面這個程序蕉扮,會在5s后關閉reactor,代碼里使用了callLater函數(shù)為Twisted注冊了一個回調函數(shù) 颗圣,api可以查看文檔twisted ReactorBase文檔

有一個很好的地方就是twisted 里面做好了錯誤異常處理喳钟,如果回調函數(shù)里面有exception,twisted會捕捉到了并輸出日志(所以scrapy spider中parse response的方法里面有錯在岂,也只會輸出錯誤堆棧奔则,而不會讓爬蟲掛掉)

結語

下一篇計劃寫下 twisted 的defer
先大體看下
異步編程中,defer機制主要是用來管理callback函數(shù)蔽午,在twisted中易茬,許多功能的實現(xiàn)都是采用的事件驅動機制,在異步編程中及老,錯誤處理機制和同步程序并不一樣抽莱,異步程序會無視錯誤執(zhí)行下去。在異步程序中處理錯誤顯得十分重要骄恶。defer就是來可以幫助我們來管理我們的callback和errback函數(shù)岸蜗。合理的安排defer在異步編程中顯得十分重要。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末叠蝇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悔捶,老刑警劉巖铃慷,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蜕该,居然都是意外死亡犁柜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門堂淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來馋缅,“玉大人,你說我怎么就攤上這事绢淀∮┿玻” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵皆的,是天一觀的道長覆履。 經(jīng)常有香客問我,道長费薄,這世上最難降的妖魔是什么硝全? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮楞抡,結果婚禮上伟众,老公的妹妹穿的比我還像新娘。我一直安慰自己召廷,他們只是感情好凳厢,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柱恤,像睡著了一般数初。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梗顺,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天泡孩,我揣著相機與錄音,去河邊找鬼寺谤。 笑死仑鸥,一個胖子當著我的面吹牛,可吹牛的內容都是我干的变屁。 我是一名探鬼主播眼俊,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼粟关!你這毒婦竟也來了疮胖?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澎灸,沒想到半個月后院塞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡性昭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年拦止,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糜颠。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡汹族,死狀恐怖,靈堂內的尸體忽然破棺而出其兴,到底是詐尸還是另有隱情顶瞒,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布忌警,位于F島的核電站搁拙,受9級特大地震影響,放射性物質發(fā)生泄漏法绵。R本人自食惡果不足惜箕速,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望朋譬。 院中可真熱鬧盐茎,春花似錦、人聲如沸徙赢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狡赐。三九已至窑业,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枕屉,已是汗流浹背常柄。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搀擂,地道東北人西潘。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像哨颂,于是被迫代替她去往敵國和親喷市。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容