学习 Twisted 的 reactor (1)
时间:2007-05-18 来源:ahhy
Twisted Matrix 是一种用来进行网络服务和应用程序的编程纯 Python 框架。并且该框架的中心概念还是非阻塞异步服务器。 下面开始学习 twisted 中的 reactor 机制(反应器)。以下是一个非常常见的 Twisted 启动 reactor 的代码:
from twisted.internet import reactor |
|
-- /twisted/internet/selectreactor.py |
在一开始,创建了 SelectReactor(根据名字也可以知道该 reactor 是基于 select() 的) 的一个实例,而 SelectReactor 又是派生自 posixbase.PosixReactorBase 的 -- 一个基于文件描述符的 reactor,又跟进一下 posixbase.PosixReactorBase,可知又派生自 ReactorBase 类,并且在创建实例的时候在 ReactorBase 里做了一些和系统相关的初始化工作,如下代码:
-- /twisted/internet/base.py |
呵呵,到这里还真的做了一些事情了:
* 1,初始化线程调用队列* 2,初始化事件触发器s (reactor 为事件触发机制)
* 3,addSystemEventTrigger(添加 system 事件触发器),可能是我们非常需要知道的了:)
下面再看看这个方法做哪些细节的事情:
-- /twisted/internet/base.py |
可见,在该方法主要用于添加我们需要注册(关注)的事件,以及对应的处理方法的,并且对于每一个系统事件(system event),如 startup(启动), shutdown(关闭), persist(持续),都有三种状态:'before', 'during', 'after'。
并且这些都由 Reactor 进行触发,并对相应的事件及状态调用指定的(注册的)方法 -- 即这里的参数 _f 指定的 callable 对象。 * self._eventTriggers 为一个字典(由上的源代码可知),保存了事件类型(_eventType) 与具体的触发器(列表) -- triglist 之间的对应关系 * triglist [[],[],[]] 该触发器列表只有三个元素(即对应于三种不同的状态,before, during, after) * (_phase, _eventType, (_f, args, kw)) 分别对应 “事件状态”,“事件类型”,“方法,及其对应的参数列表” 说白了,就是这么个情况:每个事件类型有三种状态,而每种状态可能对应不同的方法。(可能有点像说气话了) 让我们再回到 selectreactor.py 中的 install() 方法(是该透透气了:)),还没完,里面又调用了 installReactor(reactor) 了,
-- /twisted/internet/main.py |
头上有点冒汗了,才刚初始化 initialize 就冒汗了,希望是兴奋的汗水,不过应该是夏天了,是有点热了,吃根冰棍后继续 ... ...