【发布时间】:2018-10-28 04:39:02
【问题描述】:
我正在编写一个应用程序来获取发布到 Redis 中的通道的消息并进行处理。这是一个长期存在的应用程序,基本上从不收听频道。
def msg_handler():
r = redis.client.StrictRedis(host='localhost', port=6379, db=0)
sub = r.pubsub()
sub.subscribe(settings.REDIS_CHANNEL)
while True:
msg = sub.get_message()
if msg:
if msg['type'] == 'message':
print(msg)
def main():
for i in range(3):
t = threading.Thread(target=msg_handler, name='worker-%s' % i)
print('thread {}'.format(i))
t.setDaemon(True)
t.start()
while True:
print('Waiting')
time.sleep(1)
当我运行这个程序时,我注意到它没有收到在程序启动之前发布到频道的消息。在应用订阅频道后,将消息发送到频道可以正常工作。
在制作中,很可能在节目开始之前,频道中就有一些消息。有没有办法获取这些旧消息?
【问题讨论】:
-
sn-p 没有运行,因为缺少必要的东西。什么是
settings.REDIS_CHANNEL?。您启动了三个侦听器,但从不发送消息。你能模拟填充的 REDIS_CHANNEL 吗? -
消息的
producer与consumer不在同一个应用程序中是很正常的,这正是这里的情况。我没有包含代码发布消息,因为它工作得很好。而REDIS_CHANNEL显然只是一个常数。为什么重要? -
因为我无法重现您的问题。您可能想深入研究 pubsub 的代码,以找出您没有收到消息的原因。
-
@Christoph 如果您在订阅之前发布并且仍然收到消息,我会感到惊讶。当我阅读更多关于此的内容时,似乎 Redis 没有
Guarantee delivery,这意味着“如果在发布发生时订阅者没有在监听,则该订阅者的事件将丢失。”根据link
标签: python redis publish-subscribe