Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python txredisapi订阅并异步侦听_Python_Redis_Twisted_Publish Subscribe_Subscribe - Fatal编程技术网

Python txredisapi订阅并异步侦听

Python txredisapi订阅并异步侦听,python,redis,twisted,publish-subscribe,subscribe,Python,Redis,Twisted,Publish Subscribe,Subscribe,我在一个使用Python、Twisted和Redis的项目中工作。因此,团队决定使用txredisapi进行Python模块和Redis之间的通信。这个项目做了很多不同的事情,我们需要订阅多个通道来监听Redis发送的消息,而不需要停止其他功能(异步) 一次执行能否同时处理所有工作并监听Redis发送的消息,或者我们必须在不同的流中分离并执行代码 我们使用以下代码来侦听消息: import txredisapi as redis class RedisListenerProtocol(redi

我在一个使用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()
我很想知道如何指定连接必须使用“RedistenerFactory”,然后我猜当消息到达时会触发函数“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
软件包内部调用is工厂进行连接。 另一种方法是重写*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

我个人使用txredis,但这个软件包看起来也不错。似乎并不是所有的代码都存在(例如reactor.run在哪里),您的代码是基于这个示例的吗?嗨,菲利普T,谢谢你的回答。是的,我正在使用这个示例中的代码,但只在单独的情况下工作。我没有把所有的代码都放进去,因为这是一个巨大的项目(它是一个呼叫控制)。这个调用控制有一个反应器在运行。非常感谢Philippe T.,第二个方法工作得很好,但第二个参数必须是协议,而不是工厂。再次感谢!非常感谢菲利普。