##language:zh [[http://wiki.woodpecker.org.cn/moin.cgi/_e8_a7_a3_e8_af_bb_20PyTwisted#head-f4f4669b507c31a294adbe29a01a7e8b898bd013|返回目录]] ---------- ''' 解读Twisted的reactor(1) ''' -- dreamingk [<>] = 解读Twisted的reactor(1) = {{{ 初次使用Twisted的开发人员会惊讶于reactor的神秘,我到现在也多次听到了大家说哪里去寻找reactor的文档。为什么我们不能找到 twisted.internet.reactor的文档呢?哪么,现在我带大家进行一次reactor的神秘之旅。 }}} 以下是一个非常常见的Twisted启动的代码 {{{ #!python from twisted.internet import reactor from twisted.internet.protocol import Protocol, Factory factory = Factory() factory.protocol = HDPush if __name__=='__main__': reactor.listenTCP(9876, factory) reactor.run() }}} 简短的来说,它的作用是启动一个在9876端口上的基于tcp的侦听。这个侦听会使用factory来进行用户请求时的处理,这里我们只定义了用户交互的协议处理是HDPush类。我们不是来讨论协议的,所以只列出这几行代码。确实我们在Twisted的文档中没有见到reactr的说明。但是这个module决不可能是天上掉下来的。我们看看它的代码: {{{ #!python """ See twisted.internet.interfaces.IReactor*. """ import sys del sys.modules['twisted.internet.reactor'] from twisted.python import runtime if runtime.platform.getType() == 'java': from twisted.internet import javareactor javareactor.install() else: #from twisted.python import log #log.msg("Installing SelectReactor, since unspecified.") from twisted.internet import default default.install() }}} 显然的,真正的reactor中做的内容非常的少。但是一上来的del sys.modules['twisted.internet.reactor']确实是将reactor这个模块从python的modules中被删除了。为什么呢?向下看就会知道,Twisted会用一个适合于你现在环境的最好的处理平台初始化好,安装在twisted.internet.reactor这个位置,从而再使它生效,但是哪时你用的reactor就是真正的有血有肉的一个类了。哪么这个类是什么样子的呢?在注释中说了: {{{ See twisted.internet.interfaces.IReactor*. }}} 呵呵,接着来看,reactor做了多么细致周到的服务: {{{ from twisted.python import runtime }}} 这里细致的找出了现有运行Twisted的运行平台,以下是它的部分代码: {{{ #!python platform = Platform() platformType = platform.getType() seconds = platform.seconds }}} Platform类在runtime中定义的非常清晰,它初始化时来确定操作系统。而getType方法,返回的会是'posix'、'win32'或'java'。 接下来reactor的代码会识别操作系统以确定如何初始化一个真的reactor: {{{ #!python if runtime.platform.getType() == 'java': from twisted.internet import javareactor javareactor.install() else: #from twisted.python import log #log.msg("Installing SelectReactor, since unspecified.") from twisted.internet import default default.install() }}} 通过runtime中的platform的类型来import不同的初始化方法。这里我们可以看到,Twisted只针对于jython和cython先进行了区别。 ---------- [[http://wiki.woodpecker.org.cn/moin.cgi/_e8_a7_a3_e8_af_bb_20PyTwisted#head-f4f4669b507c31a294adbe29a01a7e8b898bd013|返回目录]]