Отправить с клиента Twisted на сервер Twisted, только в одну сторону

Я хочу использовать Twisted для восстановления коммуникационной части существующего приложения. Это приложение отправляет данные от клиента на сервер, только в этом случае сервер ничего не отправляет.

Как мне добиться этого с помощью концепции Twisted, управляемой событиями? В настоящее время я использую connectionMade метод Protocol, но я не думаю, что это правильный путь.

class Send(Protocol):

    def connectionMade(self):
        while True:
            data = queue.get()
            self.transport.write(data + "\n")
            self.transport.doWrite()

Я почти уверен, что это не способ сделать это. ;-)

Дополнение. Моя проблема в том, что я не могу представить, какое событие использовать для этого. Я думаю, что событие connectionMade неправильное, но в моем случае я никогда не достигну никакого другого события, кроме connectionLost, потому что сервер ничего не отправляет клиенту. Следует ли мне изменить это поведение?


person Manuel Faux    schedule 16.09.2010    source источник


Ответы (2)


Нет, это определенно неправильный способ. Никогда, никогда не звоните doWrite.

Проблема здесь в том, что я делаю ставку queue.get(), просто блокирую, пока не будут какие-то данные. Если возможно, используйте неблокирующие средства передачи сообщений, а не потоки. Например, пусть ваш поток просто callFromThread обращается к вашему Send протоколу, чтобы что-то сделать.

Но, предполагая блокирующий вызов get, может сработать что-то вроде этого:

from twisted.internet.protocol import Protocol
from twisted.internet.threads import deferToThread

class Send(Protocol):
    def connectionMade(self):
        self.qget()

    def qget(self, data=None):
        if data is not None:
            self.transport.write(data)
        deferToThread(queue.get).addCallback(self.qget)
person Glyph    schedule 16.09.2010
comment
http://stackoverflow.com/questions/1538617/http-download-very-big-file/1657324#1657324 рассказывает об опасностях циклов в Twisted коде, а также охватывает производителей / потребителей, которые также могут быть полезны для спрашивающего. - person Jean-Paul Calderone; 17.09.2010
comment
Да, звучит разумно не использовать циклы и не блокировать вызовы в событиях Twisted, это сделало бы структуру, управляемую событиями, бессмысленной. - person Manuel Faux; 17.09.2010
comment
почему вы никогда не должны звонить doWrite? - person Claudiu; 27.04.2013
comment
doWrite - это метод, который вызывается из реактора, когда приходит время записать некоторые данные. Это означает, что базовый файловый дескриптор готов к записи. - person Glyph; 29.04.2013

Вот еще один вопрос, который использует UDP / Multicast для разговора между сервером и клиентом.

Я бы также предложил дополнительное чтение и примеры из самой скрученной документации.

person pyfunc    schedule 16.09.2010