С Twisted, как 'connectionMade' может запустить определенное Отложенное?
-
05-09-2019 - |
Вопрос
Это часть более масштабной программы;Я объясню только соответствующие части.По сути, мой код хочет создать новое соединение с удаленным хостом.Это должно вернуть отложенное сообщение, которое срабатывает после установления соединения, чтобы я мог что-то отправить по нему.
Я создаю связь с twisted.internet.interfaces.IReactorSSL.connectSSL
.Это призывает buildProtocol
на моем ClientFactory
экземпляр для получения нового соединения (twisted.internet.protocol.Protocol
) объект, и возвращает twisted.internet.interfaces.IConnector
.Когда соединение запущено, Twisted вызывает startedConnecting
на заводе, придавая ему IConnector
.Когда соединение действительно установлено, протокол connectionMade
вызывается обратный вызов без аргументов.
Теперь, если бы мне нужно было только одно соединение для каждого хоста / порта, остальное было бы легко.Перед вызовом connectSSL
, Я бы создал отложенный и поместил его в словарь с ключом (хост, порт).Затем, в протоколе connectionMade, я мог бы использовать self.transport.getPeer()
чтобы получить хост / порт, используйте его для поиска отложенного и запуска его обратных вызовов.Но это, очевидно, не работает, если я хочу создать более одного соединения.
Проблема в том, что я не вижу никакого другого способа связать отложенный файл, который я создал перед вызовом connectSSL
с помощью connectionMade
позже.
Решение
Посмотрев на это еще немного, я думаю, что нашел решение, хотя, надеюсь, есть способ получше;это кажется немного странным.
У Twisted есть класс, ClientCreator
это используется для создания простых одноразовых соединений.Теоретически это делает то, что я хочу;подключает и возвращает Deferred
это срабатывает при установлении соединения.Однако я не думал, что смогу это использовать, поскольку я потерял бы возможность передавать аргументы конструктору протокола и, следовательно, не имел бы возможности делиться состоянием между соединениями.
Однако я только что понял, что ClientFactory
конструктор действительно принимает *args
чтобы перейти к конструктору протокола.Или, по крайней мере, это выглядит так;документации по этому поводу практически нет.В этом случае я могу дать ему ссылку на мою фабрику (или что-то еще, если фабрика больше не нужна).И я получаю обратно Deferred
это срабатывает при установлении соединения.