[教學] Twisted的核心reactor
颱風天有點悶來寫些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
Python 近期熱門文章
PTT數位生活區 即時熱門文章