我正在使用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