flask - Python使用redis发布订阅时,监听频道时出现的问题?【一句话描述不清楚,请各位细看内容】

 你走之后你的美我如何收拾_686 发布于 2022-10-28 06:32

我想在Flask应用中添加一个简单的消息通知功能,查了很多资料,发现通知功能主要有两个问题【这也只是个人愚见,请指正】
1:服务器如何向客户端发送消息?
2:服务器如何知道何时该发送消息了?【例如,管理员想发个全站公告,这时就需要对应的模块向客户端发送通知,该如何通知该模块呢?】

对于问题1:我使用H5推出的SSE规范,使得服务器可以单向向客户端发送消息。
对于问题2:我首先想到的是轮询数据库中的消息表,一旦发现有相应的消息插入,就向客户端推送。但是感觉这样太耗资源了。于是又询问了网上的前辈,有人说使用redis做缓存。于是今天又仔细看了一天关于redis消息的发布/订阅功能【比较愚笨】。于是我想到了下面的方法:
每当消息表插入消息时,就向对应的频道发布一条消息,内容主要是要发送消息的主要组成部分,然后对应的消息发送模块已经订阅了这个频道,当然就能收到要发送的消息了。可是听着简单,我在实践时又遇到了一个问题,具体的示例如下所示:
问题一:这是SSE访问的路由,在该路由中订阅频道

ps.listen是用来监听频道的,源码中是一个while循环,如下所示:

如果频道中有发布消息,那么for循环中就能取出data,然后返回,这样看着挺好,但是SSE规范中,如果每隔一段时间服务器没有发送数据的话,就会重新请求连接。我设置的时间是1分钟【自我感觉已经够长了】,可是如果10分钟甚至更长时间频道中都没有消息,那么for循环就取不出data,'/sse'请求就会一直得不到响应,就会出现下面的情况:

这种情况应该也是很消耗资源的吧,请问该怎么解决这种情况呢?

问题二:我的SSE规范的代码在message.html中写的,访问路由如下【hello_world只是示例】:

总感觉访问'/message'的时候特别卡,这是怎么回事,是跟线程有关系吗?

望各位前辈能够指导下该怎么解决上述的问题。

1 个回答
  • import redis, threading
    r = redis.Redis(host='127.0.0.1', port=6379, db=3)
    
    def x():
        while 1:
            time.sleep(3)
            r.publish("a", 'a_%s'% time.time())
            r.publish('b', 'b_%s'% time.time())
    xt = threading.Thread(target=x)
    xt.setDaemon(True)
    xt.start()
    
    ps = r.pubsub()
    ps.subscribe(['a', 'b'])
    for item in ps.listen():
        print item
    2022-10-29 10:02 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有