Con torcida, ¿cómo puede el fuego 'connectionMade' Diferido un específico?
-
05-09-2019 - |
Pregunta
Esto es parte de un programa más grande; Voy a explicar sólo las partes pertinentes. Básicamente, mi código quiere crear una nueva conexión a un host remoto. Esto debería devolver un diferido, el cual se activa una vez establecida la conexión, por lo que puede enviar algo en él.
Estoy creando la conexión con twisted.internet.interfaces.IReactorSSL.connectSSL
. Esto exige buildProtocol
en mi ejemplo ClientFactory
para obtener un objeto nueva conexión (twisted.internet.protocol.Protocol
), y devuelve un twisted.internet.interfaces.IConnector
. Cuando se inicia la conexión, Twisted llama startedConnecting
en la fábrica, lo que le da la IConnector
. Cuando la conexión se hace realmente, devolución de llamada connectionMade
del protocolo se llama, sin argumentos.
Ahora, si sólo necesitaba una conexión por cada host / puerto, el resto sería fácil. Antes de llamar a connectSSL
, me gustaría crear un diferido y lo puso en un diccionario enchavetado en (host, puerto). Luego, en connectionMade del protocolo, que podría utilizar self.transport.getPeer()
para recuperar el host / puerto, lo utilizan para buscar el diferido, y el fuego de sus devoluciones de llamada. Pero esto, obviamente, se descompone si quiero crear más de una conexión.
El problema es que no puedo ver ninguna otra manera de asociar un diferidos creé antes de llamar connectSSL
con el connectionMade
más adelante.
Solución
En cuanto a este un poco más, creo que he llegado a una solución, aunque es de esperar que hay una manera mejor; esto parece un poco raro.
Twisted tiene una clase, ClientCreator
que se utiliza para la producción de conexiones simples de un solo uso. Que, en teoría, hace lo que yo quiero; conecta y devuelve un Deferred
que se activa cuando se establece la conexión. No pensé que podría utilizar esto, sin embargo, ya que perdería la capacidad de pasar argumentos al constructor de protocolo, y por lo tanto no hay manera de compartir el estado entre las conexiones.
Sin embargo, me he dado cuenta de que el constructor ClientFactory
sí acepta *args
para pasar al constructor protocolo. O por lo menos se parece a ella; prácticamente no hay documentación de este. En ese caso, puedo darle una referencia a mi fábrica (o cualquier otra cosa, si la fábrica ya no es necesario). Y que vuelva la Deferred
que se activa cuando se establece la conexión.