1

扭曲的文档中,它说:

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

这样做的首选方法是什么?特别是,将它传递给协议的最佳方式是什么?(特别是当标准的 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()

仅仅为了访问反应器而创建工厂类似乎有点愚蠢,因为想要访问反应器必须相当普遍。

4

1 回答 1

2

仅仅为了访问reactor而做一个工厂类似乎有点傻

很多编程任务“有点傻”。以我的经验,在大多数领域,最先进的编程实际上是非常愚蠢的。

但是,如果您使用的是足够新的 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(...)

但这仅适用于与您的问题无关的客户。

Twisted 开发团队不时讨论使大多数传输已经具有保证传输接口的一部分(它目前不是其中的一部分)reactor属性的想法。如果您想更好地回答这个问题,那么您可以尝试在这方面激发一些行动。

于 2013-09-20T11:48:40.420 回答