【问题标题】:With Twisted, how can 'connectionMade' fire a specific Deferred?使用 Twisted,“connectionMade”如何触发特定的 Deferred?
【发布时间】:2010-10-08 21:30:33
【问题描述】:

这是一个更大计划的一部分;我将仅解释相关部分。基本上,我的代码想要创建一个到远程主机的新连接。这应该返回一个 Deferred,一旦建立连接就会触发,所以我可以在上面发送一些东西。

我正在创建与twisted.internet.interfaces.IReactorSSL.connectSSL 的连接。这会在我的 ClientFactory 实例上调用 buildProtocol 以获取新的连接 (twisted.internet.protocol.Protocol) 对象,并返回 twisted.internet.interfaces.IConnector。当连接开始时,Twisted 在工厂调用startedConnecting,给它IConnector。当实际建立连接时,会调用协议的 connectionMade 回调,不带任何参数。

现在,如果每个主机/端口只需要一个连接,其余的就很容易了。在调用connectSSL 之前,我会创建一个 Deferred 并将其放入以(主机、端口)为键的字典中。然后,在协议的 connectionMade 中,我可以使用self.transport.getPeer() 来检索主机/端口,使用它来查找 Deferred,并触发它的回调。但是,如果我想创建多个连接,这显然会失败。

问题是我看不到任何其他方法可以将我在稍后调用 connectSSL 之前创建的 Deferred 与 connectionMade 关联起来。

【问题讨论】:

    标签: python connection twisted reactor


    【解决方案1】:

    再看一遍,我想我已经想出了一个解决方案,尽管希望有更好的方法;这似乎有点奇怪。

    Twisted 有一个类ClientCreator,用于生成简单的一次性连接。理论上它可以满足我的需求;连接并返回一个在建立连接时触发的Deferred。不过,我认为我不能使用它,因为我会失去将参数传递给协议构造函数的能力,因此无法在连接之间共享状态。

    但是,我刚刚意识到 ClientFactory 构造函数确实接受 *args 传递给协议构造函数。或者至少看起来像;几乎没有这方面的文档。在这种情况下,我可以给它一个我的工厂的引用(或者其他任何东西,如果工厂不再需要的话)。我找回了在建立连接时触发的Deferred

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      相关资源
      最近更新 更多