lig*_*ght 8 python networking twisted reactor
例如,如果一个应用程序执行from twisted.internet import reactor
,而另一个应用程序执行相同操作,那些应用程序是否reactors
相同?
我问,因为Deluge,一个使用扭曲的应用程序,看起来它使用reactor将他们的UI(gtk)连接到被扭曲驱动的应用程序的其余部分(我试图理解源代码).例如,当UI关闭时,它只是调用reactor.stop()
.
这就是它的全部吗?这对我来说似乎有些神奇.如果我想运行另一个使用扭曲的应用程序怎么办?
Ale*_*lli 14
是的,Python中的每个模块都是全局的,或者,更好的是,单个模型:当你这样做时from twisted.internet import reactor
,Python的导入机制首先检查sys.modules['twisted.internet.reactor']
,如果存在,则返回所述值; 只有当它不存在时(即,第一次导入模块)是第一次实际加载的模块(并存入一个条目,sys.modules
以便将来可能导入).
在Singleton设计模式中没有什么特别神奇的东西,尽管当你迫切需要不止一个这样的东西时,它有时会被证明是有限的,因为这个东西已经被架构命令"只有一个".Twisted的文档承认:
新的应用程序代码应该优先传递并接受reactor作为需要它的参数,而不是依赖于能够导入该模块来获取引用.这简化了单元测试,并且可以使一天支持多个反应器变得更容易(作为性能增强),尽管目前还不可能.
如果对您的应用程序至关重要,那么使其成为可能的最佳方法是为Twisted项目做出贡献,劳动(编码支持多个反应堆所需的微妙机制,即单个应用程序内的多个事件循环)或资金(资金将使得能够支持某人获得津贴才能完成这项工作).
否则,使用单独的过程(例如,使用multiprocessing
标准库的模块),每个过程不超过一个反应器.