如何使用一个线程监听redis的所有订阅通道

2024-09-30 04:30:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用python3.6.3,动态构建通道。 当客户端连接到webwsocket服务器时生成redis_客户端。在

我有大约1000到1000000个redis\u客户端,每个redis客户端都订阅一些频道。在

如何使用一个线程或IOLoop监听所有客户端消息? 你能给我一个例子,线程可以添加新的pubsub对象来监听更多的频道吗?在

是否有任何解决方案使用协同路由替换线程在这里等待,并且可以将所有协同路由连接在一起(不能使用joinall,因为有些侦听器稍后会处理。) 我使用redis py库。在


Tags: 对象redis消息客户端路由动态解决方案频道
1条回答
网友
1楼 · 发布于 2024-09-30 04:30:47

IIUC,你要找的是Redis'^{}命令。下面是一个示例,演示如何将其与redis py和侦听器线程一起使用:

import threading
import redis

class Listener(threading.Thread):
    def __init__(self, r, p):
        threading.Thread.__init__(self)
        self.redis = r
        self.pubsub = self.redis.pubsub()
        self.pubsub.psubscribe(p)

    def run(self):
        for m in self.pubsub.listen():
            if 'pmessage' != m['type']:
                continue
            if '__admin__' == m['channel'] and 'shutdown' == m['data']:
                print 'Listener shutting down, bye bye.'
                break
            print '[{}]: {}'.format(m['channel'], m['data'])

if __name__ == "__main__":
    r = redis.StrictRedis()
    client = Listener(r, '*')
    client.start()

    r.publish('channel1', 'message1')
    r.publish('channel2', 'message2')
    r.publish('channel1', 'message3')

    r.publish('__admin__', 'shutdown')
    print 'Main ended.'

相关问题 更多 >

    热门问题