Как закрыть соединение после реактора.connectTCP в Twisted - PullRequest
4 голосов
/ 27 января 2011

Я хотел задать вопрос о том, как закрыть соединение в витой RPC.
Я знаю, что был задан похожий вопрос, но, похоже, он не отвечает на мой.
У меня есть базовое соединениекак показано ниже:

cfactory = pb.PBClientFactory()
reactor.connectTCP(<host>, <port>, cfactory)
dfr.addCallbacks(<callback>, <errfun>, ...)
...
(in the <callback> func)   remote.callRemote('myfunc', ...)

Все это работает и делает то, что мне нужно.
Но проблема в том, что я вижу соединение все еще активным ("УСТАНОВЛЕНО"), если я проверяю его netstat -a.
Поскольку я делаю это между клиентом и сервером, который работает бесконечно, я не могу просто продолжать накапливать активные соединения.
Я не могу остановить реактор также по той же причине.
Итак,есть ли способ закрыть соединение, кроме создания собственного протокола?
Сначала я хотел проверить, так как все в рабочем состоянии, за исключением одного факта - если возможно, я просто добавлю нужную вещьчем начать с настройки протокола и все.
Спасибо за ваше внимание и любые общие советы будут оценены.
Тони

1 Ответ

8 голосов
/ 27 января 2011

remote является RemoteReference.Он имеет атрибут broker, который является экземпляром протокола twisted.spread.pb.Broker, который его создал.Как почти все протоколы, экземпляр Broker имеет атрибут transport, который относится к объекту, представляющему соединение, по которому работает протокол.

Следовательно, remote.broker.transport.loseConnection() должен делать то, что вы хотите.

Есть и другие варианты.Вы можете захватить экземпляр Broker на фабрике:

class MyPBFactory(pb.PBClientFactory):
    def buildProtocol(self, addr):
        proto = pb.PBClientFactory.buildProtocol(self, addr)
        self.proto = proto
        return proto

Теперь у вас есть атрибут proto на фабрике (но только после того, как соединение действительно установлено, и ничего не очистит его, поэтомувсе еще будет там после потери соединения, но вы можете позаботиться об этом).

...