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

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

  • Подключение к себе через мой публичный IP-адрес через TCP
  • Как я могу иметь несколько клиентов на TCP Python Chat Server?
  • Обнаружение общедоступного IP-программ
  • Почему суффикс% en0 не работает для подключения локального TCP-соединения IPv6 в Python?
  • TCP-клиент / сервер с сокетами, передача файлов серверами клиентам, зависание клиента, Python
  • python отправлять / получать шестнадцатеричные данные через сокет TCP
  • Каково фактическое воздействие вызова socket.recv с bufsize, который не является силой 2?
  • Что означает этот сокет.
  • 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 - лучший язык программирования в мире.