twisted.internet.reactor是全局的吗?
举个例子,如果一个应用程序写了 from twisted.internet import reactor
,而另一个应用程序也写了同样的代码,这两个 reactor
是不是一样的呢?
我问这个问题是因为 Deluge 这个使用了 twisted 的应用,看起来是通过 reactor 将它的用户界面(gtk)和其他部分连接起来的(我在试着理解它的源代码)。比如,当用户界面关闭时,它只是简单地调用了 reactor.stop()
。
这就是全部吗?对我来说,这感觉有点神奇。如果我想运行另一个使用 twisted 的应用程序,会怎么样呢?
2 个回答
这个反应器确实是全局的。它负责处理事件循环,你可以注册一些处理程序来处理这些事件。如果你想在同一个反应器上运行多个应用程序,可以使用 twistd 守护进程。http://twistedmatrix.com/documents/current/core/howto/application.html
是的,Python中的每个模块都是全局的,或者说是单例模式:当你执行 from twisted.internet import reactor
时,Python会先检查 sys.modules['twisted.internet.reactor']
,如果这个模块已经存在,就直接返回这个值;只有在第一次导入模块时,模块才会真正被加载(并存储在 sys.modules
中,以便将来可能再次使用)。
单例设计模式其实并没有什么特别神奇的地方,但有时候当你真的需要多个这样的东西,而架构却规定“只能有一个”的时候,它可能会让你感到受限。Twisted的文档也承认了这一点:
新的应用代码应该更倾向于在需要的地方将reactor作为参数传递和接受,而不是依赖于导入这个模块来获取引用。这可以简化单元测试,并且可能会让将来支持多个reactor(作为性能提升)变得更容易,尽管目前这还不可能。
如果这对你的应用至关重要,最好的办法就是为Twisted项目做贡献,可以是劳动(编写支持多个reactor的微妙机制,也就是在一个应用中支持多个事件循环)或者资金(资金可以支持某人领取薪水来完成这项工作)。
否则,可以使用独立的进程(例如使用标准库中的 multiprocessing
模块),每个进程中只使用一个reactor。