[教學] Twisted的核心reactor

看板Python作者 (Victor)時間17年前 (2008/07/18 15:26), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串1/1
颱風天有點悶來寫些Twisted的文章好了 今天介紹的是Twsited的核心reactor 這個東西一開始有點難以理解,但是了解它的原理以後 其實很簡單易用 首先要介紹的是reactor在運作中扮演的角色 對於網路程式而言,有一堆的非同步的任務是很正常的事情 例如下載一個頁面,事情從開始做到發生,就是一個非同步的事件 而reactor的好處就是集中處理這些事件 以我的方式來形容,我說reactor就像是一個中央指揮所 而非同步事件就像派給別人去做的工作,中央指揮所派出去工作 到完成前它不會想去管這件事的細節,但是一但完成了工作 或是出了差錯,就回排隊向中央指揮所回報 舉個例子 張三去砍柴 李四挖壕溝 王五煮飯 這些事情同時開始做,過了一陣子李四做完了 便到中央指揮所去排隊報告完成這件事 王五也做完了,就排在李四後面 接著張三也完成了,排在王五後面 而中央指揮所就一一地檢視這些報告,做出相應的命令 --------------------------------- 換成以reactor的角度來看就像是 下載網頁 連線到遠端 接受連線 下載網頁完成,將完成的訊息放入reactor的queue裡 接受連線完成,將完成訊息放入reactor的queue裡 連線遠端錯誤,將錯誤訊息放入reactor的queue裡 reactor.run()這裡面的迴圈所做的事情 就是從queue裡拿出這些一個一個的事件去處理 很像windows的message處理事件的迴圈 這樣做有什麼好處呢,通常reactor.run()都是在main-thread裡執行的 而所有存取到共同資源的事情都在reactor.run()的thread裡被執行 就可以避免thread的同步、race condition等麻煩的問題 Twsited的所有東西都是由reactor驅動的 而它還能拿來排程(我現在正在寫的程式 XD 固定時間到去抓網頁) 像這樣 reactor.callLater(5.0, sayHello) 這樣在5秒後就會執行sayHello這個函數,而且會是在main-thread裡執行 只要想清楚了,其實就會發現reactor的概念蠻簡單的 就這樣而已,把非同步的事件集中在reactor處理這樣 其實Twsited的reactor是一個軟體架構的pattern,有興趣可以去找來看看 很多網路framework都是用這樣的pattern -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.170.5.243

07/19 11:19, , 1F
推!
07/19 11:19, 1F
文章代碼(AID): #18W4Mom4 (Python)
文章代碼(AID): #18W4Mom4 (Python)