8

例如,如果一个应用程序这样做from twisted.internet import reactor,而另一个应用程序也这样做,那么它们reactors是否相同?

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

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

4

2 回答 2

14

是的,Python 中的每个模块总是全局的,或者说得更好,是一个单例:当你这样做时from twisted.internet import reactor,Python 的导入机制首先检查sys.modules['twisted.internet.reactor'],如果存在,则返回所述值;仅当它不存在时(即第一次导入模块)才是第一次实际加载的模块(并隐藏在条目中sys.modules以备将来可能的导入)。

Singleton 设计模式并没有什么特别神奇的地方,尽管当你迫切需要不止一种而架构规定“只能有一个”的东西时,它有时会受到限制。Twisted 的文档承认:

新的应用程序代码应该更喜欢在需要的地方传递和接受反应器作为参数,而不是依赖能够导入此模块来获取引用。这简化了单元测试,并且有朝一日可能更容易支持多个反应器(作为性能增强),尽管目前还不可能。

如果它对您的应用程序至关重要,那么实现它的最佳方式是为 Twisted 项目做出贡献,无论是劳动力(编码支持多个反应器所需的微妙机制,即在单个应用程序中的多个事件循环)或资金(金钱将使某人获得津贴以完成这项工作)。

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

于 2010-08-06T14:43:32.297 回答
2

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

于 2010-08-06T14:50:45.023 回答