3

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

4

1 回答 1

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
于 2013-09-03T12:28:03.670 回答