数据库
首页 > 数据库> > python-txredisapi订阅并收听异步

python-txredisapi订阅并收听异步

作者:互联网

我正在使用Python,Twisted和Redis进行项目.因此,团队决定使用txredisapi进行Python模块和Redis之间的通信.这个项目做很多不同的事情,我们需要订阅几个频道来监听Redis发送的消息,而其他功能不会停止(异步).

一个执行程序可以同时处理所有工作并监听Redis发送的消息吗?还是必须分开并以不同的流程执行代码?

我们使用以下代码来侦听消息:

import txredisapi as redis

class RedisListenerProtocol(redis.SubscriberProtocol):
    def connectionMade(self):
        self.subscribe("channelName")
    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 RedisListenerFactory(redis.SubscriberFactory):
    maxDelay = 120
    continueTrying = True
    protocol = RedisListenerProtocol

我们尝试通过以下方式收听消息:

self.connRedisChannels = yield redis.ConnectionPool()

我想知道如何指定连接必须使用“ RedisListenerFactory”,然后我猜想消息到达时将触发函数“ messageReceived”.

任何建议,示例或更正将不胜感激.

谢谢!

以下代码解决了该问题:

from twisted.internet.protocol import ClientCreator
from twisted.internet import reactor

defer = ClientCreator(reactor, RedisListenerProtocol).connectTCP(HOST, PORT)

感谢Philippe T.的帮助.

解决方法:

如果您想直接使用redis.Connection()可以在执行以下操作之前:

redis.SubscriberFactory.protocol = RedisListenerProtocol

程序包在内部进行内部调用以进行连接.
另一种方法是重写* Connection类,并使* Connection工厂使用您的工厂.

要在代码的其他部分建立连接,您可以执行以下操作:

from twisted.internet.protocol import ClientCreator
from twisted.internet import reactor

# some where : 
defer = ClientCreator(reactor, RedisListenerProtocol).connectTCP(__HOST__, __PORT__)
# the defer will have your client when the connection is done

标签:redis,publish-subscribe,twisted,subscribe,python
来源: https://codeday.me/bug/20191122/2062763.html