Каков правильный способ доступа к транспорту протоколов в Twisted?

В примере клиента TCP:

from twisted.internet import reactor, protocol # a client protocol class EchoClient(protocol.Protocol): """Once connected, send a message, then print the result.""" def connectionMade(self): self.transport.write("hello, world!") def dataReceived(self, data): "As soon as any data is received, write it back." print "Server said:", data self.transport.loseConnection() def connectionLost(self, reason): print "connection lost" class EchoFactory(protocol.ClientFactory): protocol = EchoClient def clientConnectionFailed(self, connector, reason): print "Connection failed - goodbye!" reactor.stop() def clientConnectionLost(self, connector, reason): print "Connection lost - goodbye!" reactor.stop() # this connects the protocol to a server runing on port 8000 def main(): f = EchoFactory() reactor.connectTCP("localhost", 8000, f) reactor.run() # this only runs if the module was *not* imported if __name__ == '__main__': main() 

У меня есть периодическая задача, которая должна отправлять данные на сервер. Вся логика задачи находится за пределами протокола и фабрики. Это плохая форма для передачи f и использования f.protocol.transport.write("Something?") ?

  • Когда использовать Tornado, когда использовать Twisted / Cyclone / GEvent / other
  • Взаимодействие пользователя в скрученном процессе
  • Как установить файл python .egg
  • Twisted transport.write
  • Как использовать Twisted для получения списка пользователей IRC-канала
  • Twisted: Как я могу идентифицировать протокол при первоначальном подключении, а затем делегировать соответствующую реализацию протокола?
  • Каков самый pythonic способ перебора всех строк из нескольких файлов?
  • Найти индексы повторяющихся элементов в массиве (Python, NumPy)
  • Преобразование последовательности Python в массив NumPy, заполнение отсутствующих значений
  • песочница для выполнения, возможно, недружелюбного кода на питоне
  • Групповые данные по сезонам с использованием python и pandas
  • Ошибка: не удается запустить новый поток
  • 2 Solutions collect form web for “Каков правильный способ доступа к транспорту протоколов в Twisted?”

    Вы можете перестроить свой код и воспользоваться некоторыми новыми API-интерфейсами, чтобы избежать необходимости выполнять дополнительную работу на заводе для достижения ваших целей. Ответ Майка Лутца совершенно правильный, и я обычно предлагал людям до конечных точек. Теперь, когда у нас есть конечные точки, я предлагаю использовать их вместо этого.

    API-интерфейсы конечных точек позволяют вам писать основную функцию, которая больше похожа на это:

     def main(): e = HostnameEndpoint(reactor, "localhost", 8000) f = EchoFactory() d = e.connect(f) d.addCallback(connected) return d def connected(protocol): # protocol is an instance of EchoClient and is connected return LoopingCall(doStuff, protocol).start(3) 

    Вы также можете подумать о том, чтобы адаптировать это для использования twisted.internet.task.react который позаботится о том, чтобы какая-то twisted.internet.task.react для вашего реактора.

    Я тоже новичок в крученном мире, поэтому возьмите с собой соль, но я говорю ее приемлемую форму.

    См. Следующие SO, где я привел пример того, как перехватывать части скрученных вместе: постоянные соединения в скрученном виде . (как это бывает, что ответ также говорит о периодических задачах …)

    РЕДАКТИРОВАТЬ

    Ой, подождите. У вас есть завод.

    Завод создает новый экземпляр протокола каждый раз, когда есть соединение, поэтому ваш f.protocol.transport.write не будет работать ( protocol укажет на класс, а не на связанный экземпляр класса). Попробуйте запустить образец кода из вопроса о постоянных подключениях , я делаю список соединений ( self.clients на заводе), используя эту структуру, вы можете использовать .write различных соединений, итерации через список соединений

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