gpt4 book ai didi

python - 如何用一个线程监听redis的所有订阅 channel ?

转载 作者:可可西里 更新时间:2023-11-01 11:16:21 26 4
gpt4 key购买 nike

我使用 python 3.6.3,动态构建 channel 。当客户端连接到 webwsocket 服务器时,redis_client 构建。

我有大约 1000 到 100,0000 个 redis_clients,每个 redis_client 订阅一些 channel 。

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

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

最佳答案

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.'

关于python - 如何用一个线程监听redis的所有订阅 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47647065/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com