txredisapi订阅并监听异步

时间:2013-09-03 11:36:43

标签: python redis twisted publish-subscribe subscribe

我正在使用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.的帮助。

1 个答案:

答案 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