我正在使用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()
我很想知道如何指定Connection必须使用“RedisListenerFactory”,然后我猜消息到达时会触发“messageReceived”函数。
任何建议,示例或更正都会被贬低。
谢谢!
以下代码解决了这个问题:
from twisted.internet.protocol import ClientCreator
from twisted.internet import reactor
defer = ClientCreator(reactor, RedisListenerProtocol).connectTCP(HOST, PORT)
感谢Philippe T.的帮助。
答案 0 :(得分:3)
如果你想直接使用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