- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在一个使用 Python、Twisted 和 Redis 的项目中工作。因此,团队决定使用 txredisapi 进行 Python 模块和 Redis 之间的通信。这个项目做了很多不同的事情,我们需要订阅几个 channel 来收听 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
关于python - txredisapi 异步订阅和监听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18591309/
我在一个使用 Python、Twisted 和 Redis 的项目中工作。因此,团队决定使用 txredisapi 进行 Python 模块和 Redis 之间的通信。这个项目做了很多不同的事情,我们
使用 Python、Twisted、Redis 和 txredisapi。 如何在建立连接后获取用于订阅和取消订阅 channel 的 SubscriberProtocol? 我想我需要获取 Subs
下面我提供了一个代码示例,它使用来自 Redis 的数据简单地响应 HTTP GET 请求: 请求: http://example.com:8888/?auth=zefDWDd5mS7mcbfoDbD
我是一名优秀的程序员,十分优秀!