Периодическое выполнение функции в скрученном протоколе

Я ищу способ периодически отправлять данные по всем клиентам, подключенным к TCP-порту. Я смотрю на скрученный питон, и мне известно о реакторе.callLater. Но как я могу использовать его для отправки некоторых данных всем связанным клиентам периодически? Логика отправки данных находится в классе протокола, и она создается при помощи реактора по мере необходимости. Я не знаю, как связать его с реактором во все протокольные экземпляры …

  • Отправка сообщений с других языков на ядро ​​IPython
  • Импортировать модуль python через Интернет / несколько протоколов или динамически создавать модуль
  • Гарантируется ли TCP в порядке?
  • Мониторинг протоколов протоколов JSON
  • Как раскрыть объект ssl.SSLContext
  • Веб-интерфейс для скрученного приложения
  • Отправка сообщений с других языков на ядро ​​IPython
  • Мониторинг протоколов протоколов JSON
  • Импортировать модуль python через Интернет / несколько протоколов или динамически создавать модуль
  • Как раскрыть объект ssl.SSLContext
  • Гарантируется ли TCP в порядке?
  • 2 Solutions collect form web for “Периодическое выполнение функции в скрученном протоколе”

    Вероятно, вы захотите сделать это на фабрике для соединений. Фабрика автоматически не уведомляется о каждом соединении и не теряется, поэтому вы можете уведомить об этом протокол.

    Ниже приведен полный пример того, как использовать twisted.internet.task.LoopingCall в сочетании с настраиваемой базой Factory и Protocol, чтобы объявить, что «10 секунд прошло» для каждого подключения каждые 10 секунд.

    from twisted.internet import reactor, protocol, task class MyProtocol(protocol.Protocol): def connectionMade(self): self.factory.clientConnectionMade(self) def connectionLost(self, reason): self.factory.clientConnectionLost(self) class MyFactory(protocol.Factory): protocol = MyProtocol def __init__(self): self.clients = [] self.lc = task.LoopingCall(self.announce) self.lc.start(10) def announce(self): for client in self.clients: client.transport.write("10 seconds has passed\n") def clientConnectionMade(self, client): self.clients.append(client) def clientConnectionLost(self, client): self.clients.remove(client) myfactory = MyFactory() reactor.listenTCP(9000, myfactory) reactor.run() 

    Я бы предположил, что самый простой способ сделать это – управлять списком клиентов в протоколе с connectionMade и connectionLost в клиенте, а затем использовать LoopingCall, чтобы каждый клиент отправлял данные.

    Это немного инвазивно, но я не думаю, что вы захотите сделать это, если протокол не имеет никакого контроля над передачей / приемом. Конечно, мне нужно было бы увидеть, как ваш код действительно знает, как он будет хорошо вписываться. Получил ссылку github? 🙂

    Python - лучший язык программирования в мире.