问题描述
我正在尝试使用 redis-py 客户端实现一个基本的发布订阅。 这个想法是,发布者实际上是一个回调,它会被定期调用,并会在回调函数中发布一些关于 channel1 的信息。
订阅者将在该频道上侦听此消息并进行相应的处理。
订阅者实际上是一个部署在 k8s 上的基本网络服务器,它应该只是显示它通过 event_handler 函数接收到的消息。
subscriber.py
class Sub(object):
def __init___(self):
redis = Redis(host=...,port=...,password=...,db=0)
ps = redis.pubsub(ignore_subscribe_messages=True)
ps.subscribe(**{'channel1': Sub.event_handler})
ps.run_in_thread(sleep_time=0.01,daemon=True)
@staticmethod
def event_handler(msg):
print("Hello from event handler")
if msg and msg.get('type') == 'message': # interested only in messages,not subscribe/unsubscribe/pmessages
# process the message
publisher.py
redis = Redis(host=...,db=0)
def call_back(msg):
global redis
redis.publish('channel1',msg)
一开始,消息被发布,订阅者事件处理程序正确打印和处理它。
问题是,几个小时后,订阅者停止显示这些消息。我检查了发布者日志,消息肯定会发送出去,但我无法弄清楚为什么 event_handler 在几个小时后没有被调用。
其中的 print 语句停止打印,这就是为什么我说处理程序在几个小时后不会被触发。
最初我怀疑线程一定已经死了,但是在 exec 进入系统时,我看到它列在线程列表下。 我已经阅读了很多博客和文档,但没有找到太多帮助。
我只能推断出事件处理程序在一段时间后停止调用。 任何人都可以帮助了解正在发生的事情以及以非阻塞方式可靠地使用 pubsub 消息的最佳方式吗?
非常感谢你们的任何见解! :(
解决方法
您可以发布整个puplisher.py
吗?可能是 call_back(msg)
不再被调用。
要检查客户端是否仍在订阅,您可以在 PUBSUB CHANNELS
中使用命令 reds-cli
。
问候,马丁