是的,Python 中的每个模块总是全局的,或者说得更好,是一个单例:当你这样做时from twisted.internet import reactor
,Python 的导入机制首先检查sys.modules['twisted.internet.reactor']
,如果存在,则返回所述值;仅当它不存在时(即第一次导入模块)才是第一次实际加载的模块(并隐藏在条目中sys.modules
以备将来可能的导入)。
Singleton 设计模式并没有什么特别神奇的地方,尽管当你迫切需要不止一种而架构规定“只能有一个”的东西时,它有时会受到限制。Twisted 的文档承认:
新的应用程序代码应该更喜欢在需要的地方传递和接受反应器作为参数,而不是依赖能够导入此模块来获取引用。这简化了单元测试,并且有朝一日可能更容易支持多个反应器(作为性能增强),尽管目前还不可能。
如果它对您的应用程序至关重要,那么实现它的最佳方式是为 Twisted 项目做出贡献,无论是劳动力(编码支持多个反应器所需的微妙机制,即在单个应用程序中的多个事件循环)或资金(金钱将使某人获得津贴以完成这项工作)。
否则,使用单独的进程(例如,使用multiprocessing
标准库的模块),每个进程不超过一个反应器。