在twisted docs中,它说:
新的应用程序代码应该优先传递并接受reactor作为需要它的参数,而不是依赖于能够导入此模块来获取引用。这简化了单元测试,并且可以使一天支持多个反应器变得更容易(作为性能增强),尽管目前还不可能。
这样做的首选方式是什么?特别是,将它传递给协议的最佳方法是什么? (特别是当标准的twisted.internet.protocol.Factory就是所需要的时候。)
编辑:为了澄清,由于协议没有直接实例化,我想知道下面的方法是否是首选方式,或者是否有更好的方法允许访问反应堆协议
class MyFactory(protocol.Factory):
def __init__(self, rct):
self.reactor = rct
class MyProtocol(protocol.Protocol):
def __init__(self):
self.reactor = None
def connectionMade(self):
self.reactor = self.factory.reactor
if __name__=="__main__":
from twisted.internet import reactor
f = MyFactory(reactor)
f.protocol = MyProtocol
reactor.listenXXX(whatever)
reactor.run()
仅仅出于访问反应堆的目的而制造工厂类似乎有点愚蠢,因为想要进入反应堆必须相当普遍。
答案 0 :(得分:2)
仅仅出于访问反应堆的目的而制造工厂类似乎有点愚蠢
很多编程任务都“有点傻”。根据我的经验,编程技术在大多数领域实际上是非常愚蠢的。
但如果您使用的是Twisted的新版本,那么您可以按照以下方式执行此操作:
from twisted.internet.protocol import Factory
factory = Factory.forProtocol(YourProtocol, reactor)
如果你使用的是没有此API的旧版Twisted,那么你可以改为:
from twisted.internet.protocol import ClientCreator
ClientCreator(reactor, YourProtocol, reactor).connectTCP(...)
但这仅适用于与您的问题无关的客户。
扭曲的开发团队不时讨论making the reactor
attribute that most transports already have part of the guaranteed transport interface(目前还不是其中的一部分)的想法。如果你想要更好地回答这个问题,那么你可以尝试在这方面激励一些行动。