Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Вот полный пример использования twisted.internet.task.LoopingCall в сочетании с настраиваемым базовым Factory и протоколом, объявляющим, что "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()

Ответ 2

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

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