【问题标题】:how to use one thread to listening all subscribe channel for redis?redis如何用一个线程监听所有订阅频道?
【发布时间】:2018-05-18 17:27:19
【问题描述】:

我使用 python 3.6.3,通道是动态构建的。 客户端连接到 webwsocket 服务器时的 redis_client 构建。

我有大约 1000 到 100,000 个 redis_clients,每个 redis_client 订阅一些频道。

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

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

【问题讨论】:

  • 我想你可以通过https://redis.io/commands/client-list得到它。

标签: python multithreading redis publish-subscribe coroutine


【解决方案1】:

IIUC,您要查找的是 Redis 的 PSUBSCRIBE 命令。这是一个示例,展示了如何将它与 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.'

【讨论】:

  • 我不能使用psubscribe,因为有很多redis客户端,当客户端收到消息时,他们会将消息发送给不同的用户,不同的用户使用不同的频道。频道号与用户帐号相同。如果我使用 psubscribe,我得到了所有频道的消息,我如何区分下面的这些消息是哪个用户?
  • 很抱歉,我无法理解您的问题。
  • OP 有一个有效的问题,客户想要订阅特定频道而不是单个线程中的特定模式。这两个选项都订阅了 Redis 端下面的许多频道,需要根据特定频道或特定频道模式通知该客户端。但是,客户端需要每个频道订阅一个单独的线程,而频道模式订阅只需要一个线程。
猜你喜欢
  • 2016-05-22
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 2018-07-30
  • 2011-12-31
相关资源
最近更新 更多