当前位置:  开发笔记 > 编程语言 > 正文

Redis pub/sub在订阅中添加额外频道

如何解决《Redispub/sub在订阅中添加额外频道》经验,为你挑选了1个好方法。

是否可以向Redis连接添加其他订阅?我有一个监听线程,但似乎不受新的SUBSCRIBE命令的影响.

如果这是预期的行为,如果用户为他们的兴趣或加入聊天室添加股票代码提要,应该使用的模式是什么?

我想实现一个类似于的Python类:

import threading
import redis

class RedisPubSub(object):
    def __init__(self):
        self._redis_pub = redis.Redis(host='localhost', port=6379, db=0)        
        self._redis_sub = redis.Redis(host='localhost', port=6379, db=0)        
        self._sub_thread = threading.Thread(target=self._listen)
        self._sub_thread.setDaemon(True)
        self._sub_thread.start()

    def publish(self, channel, message):
        self._redis_pub.publish(channel, message)

    def subscribe(self, channel):
        self._redis_sub.subscribe(channel)

    def _listen(self):
        for message in self._redis_sub.listen():
            print message

samplebias.. 5

在与从类继承,这是生产,你所看到的"神奇"的效果. python-redis RedisConnectionPoolthreading.local

简介:您的主线程和工作线程的self._redis_sub客户端最终使用两个不同的服务器连接,但只有主线程的连接发出了SUBSCRIBE命令.

细节:由于主线程正在创建self._redis_sub,因此该客户端最终被放入main的线程本地存储中.接下来我假设主线程进行client.subscribe(channel)调用.现在主线程的客户端在连接1上订阅.接下来,启动self._sub_thread工作线程,最终将自己的self._redis_sub属性设置为redis.Client的新实例,该实例构造新的连接池并建立与redis的新连接.服务器.

此新连接尚未订阅您的频道,因此请listen()立即返回.因此,python-redis您无法在线程之间传递与已完成订阅(或任何其他有状态命令)的已建立连接.

根据您计划实施应用程序的方式,您可能需要切换到使用其他客户端,或者提出一些其他方式将订阅状态传达给工作线程,例如通过队列发送订阅命令.

另一个问题是python-redis使用阻塞套接字,它可以防止您的侦听线程在等待消息时执行其他工作,并且除非在收到消息后立即执行此操作,否则它无法表示希望取消订阅.



1> samplebias..:

在与从类继承,这是生产,你所看到的"神奇"的效果. python-redis RedisConnectionPoolthreading.local

简介:您的主线程和工作线程的self._redis_sub客户端最终使用两个不同的服务器连接,但只有主线程的连接发出了SUBSCRIBE命令.

细节:由于主线程正在创建self._redis_sub,因此该客户端最终被放入main的线程本地存储中.接下来我假设主线程进行client.subscribe(channel)调用.现在主线程的客户端在连接1上订阅.接下来,启动self._sub_thread工作线程,最终将自己的self._redis_sub属性设置为redis.Client的新实例,该实例构造新的连接池并建立与redis的新连接.服务器.

此新连接尚未订阅您的频道,因此请listen()立即返回.因此,python-redis您无法在线程之间传递与已完成订阅(或任何其他有状态命令)的已建立连接.

根据您计划实施应用程序的方式,您可能需要切换到使用其他客户端,或者提出一些其他方式将订阅状态传达给工作线程,例如通过队列发送订阅命令.

另一个问题是python-redis使用阻塞套接字,它可以防止您的侦听线程在等待消息时执行其他工作,并且除非在收到消息后立即执行此操作,否则它无法表示希望取消订阅.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有