返回目录


解读Twisted的reactor(1) -- dreamingk [2004-08-09 07:20:25]

1. 解读Twisted的reactor(1)

初次使用Twisted的开发人员会惊讶于reactor的神秘,我到现在也多次听到了大家说哪里去寻找reactor的文档。为什么我们不能找到
twisted.internet.reactor的文档呢?哪么,现在我带大家进行一次reactor的神秘之旅。

以下是一个非常常见的Twisted启动的代码

   1 from twisted.internet import reactor
   2 from twisted.internet.protocol import Protocol, Factory
   3 
   4 factory = Factory()
   5 factory.protocol = HDPush
   6 
   7 if __name__=='__main__':
   8     reactor.listenTCP(9876, factory)
   9     reactor.run()

简短的来说,它的作用是启动一个在9876端口上的基于tcp的侦听。这个侦听会使用factory来进行用户请求时的处理,这里我们只定义了用户交互的协议处理是HDPush类。我们不是来讨论协议的,所以只列出这几行代码。确实我们在Twisted的文档中没有见到reactr的说明。但是这个module决不可能是天上掉下来的。我们看看它的代码:

   1 """
   2 See twisted.internet.interfaces.IReactor*.
   3 """
   4 import sys
   5 del sys.modules['twisted.internet.reactor']
   6 from twisted.python import runtime
   7 if runtime.platform.getType() == 'java':
   8     from twisted.internet import javareactor
   9     javareactor.install()
  10 else:
  11     #from twisted.python import log
  12     #log.msg("Installing SelectReactor, since unspecified.")
  13     from twisted.internet import default
  14     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的运行平台,以下是它的部分代码:

   1 platform = Platform()
   2 platformType = platform.getType()
   3 seconds = platform.seconds

Platform类在runtime中定义的非常清晰,它初始化时来确定操作系统。而getType方法,返回的会是'posix'、'win32'或'java'。 接下来reactor的代码会识别操作系统以确定如何初始化一个真的reactor:

   1 if runtime.platform.getType() == 'java':
   2     from twisted.internet import javareactor
   3     javareactor.install()
   4 else:
   5     #from twisted.python import log
   6     #log.msg("Installing SelectReactor, since unspecified.")
   7     from twisted.internet import default
   8     default.install()

通过runtime中的platform的类型来import不同的初始化方法。这里我们可以看到,Twisted只针对于jython和cython先进行了区别。


返回目录