Я использую витой сервер, серверы которого: websocket (autobahn) + флеш-сервер.
Когда я пытаюсь реализовать этот пример для достижения асинхронной функциональности pub / sub redis,Я столкнулся со странным заводским поведением.
Код (в if __name__ == '__main__'
):
log.startLogging(sys.stdout)
port = int(os.getenv('PORT', 5000))
ws_factory = Factory(u"ws://0.0.0.0:{}".format(port))
ws_factory.protocol = ClientProtocol
ws_factory.setProtocolOptions(autoPingInterval=2, autoPingTimeout=30)
ws_resource = WebSocketResource(ws_factory)
wsgi_resource = WSGIResource(reactor, reactor.getThreadPool(), app)
rootResource = WSGIRootResource(wsgi_resource,
{b'ws': ws_resource})
site = Site(rootResource)
reactor.listenTCP(port, site)
reactor.connectTCP("127.0.0.1", 6379, myFactory())
reactor.run()
Журнал (только для Redis Factory):
web | 2019-04-02 19:15:05+0000 [-] Starting factory <__main__.myFactory object at 0x7f437c1b64a8>
web | 2019-04-02 19:15:05+0000 [Uninitialized] <twisted.internet.tcp.Connector object at 0x7f437c1b65c0> will retry in 2 seconds
web | 2019-04-02 19:15:05+0000 [-] Stopping factory <__main__.myFactory object at 0x7f437c1b64a8>
web | 2019-04-02 19:15:08+0000 [-] Starting factory <__main__.myFactory object at 0x7f437c1b64a8>
web | 2019-04-02 19:15:08+0000 [Uninitialized] <twisted.internet.tcp.Connector object at 0x7f437c1b65c0> will retry in 8 seconds
web | 2019-04-02 19:15:08+0000 [-] Stopping factory <__main__.myFactory object at 0x7f437c1b64a8>
web | 2019-04-02 19:15:16+0000 [-] Starting factory <__main__.myFactory object at 0x7f437c1b64a8>
web | 2019-04-02 19:15:16+0000 [Uninitialized] <twisted.internet.tcp.Connector object at 0x7f437c1b65c0> will retry in 21 seconds
web | 2019-04-02 19:15:16+0000 [-] Stopping factory <__main__.myFactory object at 0x7f437c1b64a8>
web | 2019-04-02 19:15:38+0000 [-] Starting factory <__main__.myFactory object at 0x7f437c1b64a8>
web | 2019-04-02 19:15:38+0000 [Uninitialized] <twisted.internet.tcp.Connector object at 0x7f437c1b65c0> will retry in 67 seconds
web | 2019-04-02 19:15:38+0000 [-] Stopping factory <__main__.myFactory object at 0x7f437c1b64a8>
Протокол Redis:
import txredisapi as redis5
class myProtocol(redis.SubscriberProtocol):
def connectionMade(self):
print("waiting for messages...")
def messageReceived(self, pattern, channel, message):
print("pattern=%s, channel=%s message=%s" % (pattern, channel, message))
def connectionLost(self, reason):
print("lost connection:", reason)
class myFactory(redis.SubscriberFactory):
maxDelay = 120
continueTrying = True
protocol = myProtocol
Как видите, он не соединяется (не достигает даже метода connectionMade
).Redis работает на порту 6379
в контейнере Docker и наверняка работает и готов к подключению.Сначала я думал, что весь сервер WSGI портится, но с использованием только: reactor.connectTCP("127.0.0.1", 6379, myFactory())
reactor.run()
результат все тот же.Я пробовал несколько других методов для реализации txredisapi
:
application = service.Application("subscriber")
srv = internet.TCPClient("127.0.0.1", 6379, myFactory())
srv.setServiceParent(application)
и
connecting = ClientCreator(reactor, myProtocol).connectTCP("127.0.0.1", 6379)
def connected(listener):
listener.subscribe("newChannelName")
connecting.addCallback(connected)
, ни один из них не работал.
Я хотел бы использовать Redis pub / subфункция для отслеживания сообщений, отправленных через веб-сокет.