twisted.internet.reactor是全局的吗?

时间:2010-08-06 14:39:50

标签: python networking twisted reactor

例如,如果一个应用程序执行from twisted.internet import reactor,而另一个应用程序执行相同操作,那些reactors是否相同?

我问的是因为Deluge,一个使用twisted的应用程序,看起来像是使用reactor来将他们的UI(gtk)连接到被扭曲驱动的应用程序的其余部分(我试图理解源代码) )。例如,当UI关闭时,它只需调用reactor.stop()

这就是它的全部吗?这对我来说似乎有些神奇。如果我想运行另一个使用twisted的应用程序怎么办?

2 个答案:

答案 0 :(得分:14)

是的,Python中的每个模块都是全局的,或者说,更好的是单身:当你执行from twisted.internet import reactor时,Python的导入机制首先检查sys.modules['twisted.internet.reactor'],如果存在,则返回说价值;只有当它不存在时(即,第一次导入模块)是第一次实际加载的模块(并存入sys.modules中的条目以便将来可能导入)。

在Singleton设计模式中没有什么特别神奇的东西,尽管当你迫切需要不止一个这样的东西时,它有时会被证明是有限的,因为这个架构已经下令“只能有一个”。 Twisted的docs承认:

  

新的应用程序代码应该更喜欢   通过并接受反应堆作为   需要的参数,而不是   而不是依赖于能够导入   这个模块得到一个参考。这个   简化单元测试并可能   一天支持多个更容易   反应堆(作为一种表现   增强),虽然这不是   目前可能。

如果对您的应用程序至关重要的话,最好的方法就是为Twisted项目做出贡献,要么劳动(编码支持多个反应堆所需的微妙机制,即多个事件循环,在一个应用程序中) )或资金(资金将使得能够支持某人获得津贴以执行这项工作)。

否则,使用单独的流程(例如,使用标准库的multiprocessing模块),每个流程不超过一个。

答案 1 :(得分:2)

反应堆确实是全球性的。它负责事件循环,并注册处理程序以使用事件。如果要在同一个reactor中使用多个应用程序,可以使用twistd守护程序。 http://twistedmatrix.com/documents/current/core/howto/application.html