twisted.internet.reactor是全局的吗?

8 投票
2 回答
3432 浏览
提问于 2025-04-16 02:26

举个例子,如果一个应用程序写了 from twisted.internet import reactor,而另一个应用程序也写了同样的代码,这两个 reactor 是不是一样的呢?

我问这个问题是因为 Deluge 这个使用了 twisted 的应用,看起来是通过 reactor 将它的用户界面(gtk)和其他部分连接起来的(我在试着理解它的源代码)。比如,当用户界面关闭时,它只是简单地调用了 reactor.stop()

这就是全部吗?对我来说,这感觉有点神奇。如果我想运行另一个使用 twisted 的应用程序,会怎么样呢?

2 个回答

2

这个反应器确实是全局的。它负责处理事件循环,你可以注册一些处理程序来处理这些事件。如果你想在同一个反应器上运行多个应用程序,可以使用 twistd 守护进程。http://twistedmatrix.com/documents/current/core/howto/application.html

14

是的,Python中的每个模块都是全局的,或者说是单例模式:当你执行 from twisted.internet import reactor 时,Python会先检查 sys.modules['twisted.internet.reactor'],如果这个模块已经存在,就直接返回这个值;只有在第一次导入模块时,模块才会真正被加载(并存储在 sys.modules 中,以便将来可能再次使用)。

单例设计模式其实并没有什么特别神奇的地方,但有时候当你真的需要多个这样的东西,而架构却规定“只能有一个”的时候,它可能会让你感到受限。Twisted的文档也承认了这一点:

新的应用代码应该更倾向于在需要的地方将reactor作为参数传递和接受,而不是依赖于导入这个模块来获取引用。这可以简化单元测试,并且可能会让将来支持多个reactor(作为性能提升)变得更容易,尽管目前这还不可能。

如果这对你的应用至关重要,最好的办法就是为Twisted项目做贡献,可以是劳动(编写支持多个reactor的微妙机制,也就是在一个应用中支持多个事件循环)或者资金(资金可以支持某人领取薪水来完成这项工作)。

否则,可以使用独立的进程(例如使用标准库中的 multiprocessing 模块),每个进程中只使用一个reactor。

撰写回答