С Twisted, как 'connectionMade' может запускать определенный Deferred? - PullRequest
2 голосов
/ 20 февраля 2009

Это часть большой программы; Я объясню только соответствующие части. По сути, мой код хочет создать новое соединение с удаленным хостом. Это должно вернуть Deferred, который срабатывает после установления соединения, поэтому я могу что-то отправить на него.

Я создаю соединение с twisted.internet.interfaces.IReactorSSL.connectSSL. Это вызывает buildProtocol в моем экземпляре ClientFactory для получения нового объекта соединения (twisted.internet.protocol.Protocol) и возвращает twisted.internet.interfaces.IConnector. Когда соединение установлено, Twisted вызывает startedConnecting на заводе, давая ему IConnector. Когда соединение установлено, вызывается обратный вызов connectionMade протокола без аргументов.

Теперь, если бы мне было нужно только одно соединение на хост / порт, остальное было бы легко. Перед вызовом connectSSL я бы создал Deferred и поместил его в словарь с ключом (host, port). Затем в протоколе connectionMade я мог бы использовать self.transport.getPeer() для получения хоста / порта, использовать его для поиска Deferred и запуска его обратных вызовов. Но это очевидно ломается, если я хочу создать больше чем одно соединение.

Проблема в том, что я не вижу другого способа связать созданное мной Отложенное до вызова connectSSL с connectionMade позже.

1 Ответ

0 голосов
/ 20 февраля 2009

Глядя на это еще немного, я думаю, что нашел решение, хотя, надеюсь, есть лучший способ; это кажется странным.

Twisted имеет класс ClientCreator, который используется для создания простых одноразовых соединений. Теоретически он делает то, что я хочу; подключается и возвращает Deferred, который срабатывает, когда соединение установлено. Однако я не думал, что смогу использовать это, поскольку потеряю способность передавать аргументы в конструктор протокола и, следовательно, не смогу совместно использовать состояние между соединениями.

Однако я только что понял, что конструктор ClientFactory принимает *args для передачи в конструктор протокола. Или, по крайней мере, это выглядит так; для этого практически нет документации. В этом случае я могу дать ссылку на мою фабрику (или что-то еще, если фабрика больше не нужна). И я получаю обратно Deferred, который срабатывает, когда соединение установлено.

...