作者StubbornLin (Victor)
看板Python
标题[教学] Twisted的核心reactor
时间Fri Jul 18 15:26:40 2008
台风天有点闷来写些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
1F:推 Arton0306:推! 07/19 11:19