Запуск и остановка витых соединений

Я пишу приложение, которое использует python Twisted API (а именно WebSocketClientProtocol, WebSocketClientFactory, ReconnectiongClientFactory. Я хочу обернуть клиентскую фабрику в ридер со следующим интерфейсом

class Reader: 
    def start(self):
        pass
    def stop(self):
        pass

Функция Start будет использоваться для открытия соединения (т.е. подключения по ws api и начала чтения данных), а stop остановит такое соединение.

Моя проблема в том, что если я использую reactor.run() внутри start, соединение начинается, и все в порядке, но мой код никогда не проходит эту строку (похоже на блокирующий вызов для меня), и я не могу выполнить последующие строки (включить .stop в мои тесты).

Я пытался использовать такие варианты, как reactor.callFromThread(reactor.run) и reactor.callFromThread(reactor.stop), или даже эксплицитный вызов Thread(target=...), но ни один из них не работает (обычно они вообще не строят протокол или не открывают соединение).

Любая помощь или рекомендации по реализации Reader.start и Reader.stop приветствуются.


person user3084657    schedule 08.01.2018    source источник


Ответы (1)


Если вы поместите reactor.run внутри Reader.start, тогда Reader будет сложным компонентом для использования вместе с другим кодом. Ваши трудности — лишь первый симптом этого.

Вызов reactor.run и reactor.stop — это работа кода, отвечающего за управление временем жизни вашего приложения. Поместите эти вызовы где-нибудь отдельно от кода вашего приложения WebSocket. Например:

r = Reader()
r.start()
reactor.run()

Или, что еще лучше, внедрите плагин Twist(d) и дайте Twist (d) управлять реактором для вас.

person Jean-Paul Calderone    schedule 09.01.2018
comment
Спасибо за ответ. Я боялся, что мне придется поместить reactor.run и reactor.stop за пределы Reader. Не могли бы вы дать мне несколько советов по реализации скрученного подхода к плагинам? - person user3084657; 09.01.2018
comment
Конечно, ссылка на документ добавлена. - person Jean-Paul Calderone; 10.01.2018
comment
Отлично, я проверю. - person user3084657; 10.01.2018