【问题标题】:Is twisted.internet.reactor global?twisted.internet.reactor 是全球性的吗?
【发布时间】:2011-03-26 09:16:55
【问题描述】:

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

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

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

【问题讨论】:

  • 您所说的“应用程序”是什么意思?您是指单独的 Python 进程还是在单个进程中运行多个事物?

标签: python networking twisted reactor


【解决方案1】:

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

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

新的应用程序代码应该更喜欢 通过并接受反应堆作为 需要的参数,而不是 而不是依靠能够进口 此模块以获取参考。这 简化单元测试并可能使 一天支持多个更容易 反应堆(作为表演 增强),虽然这不是 目前可能。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多