Python訂閱Redis主題,實現前端通過Websocket實時獲取訂閱信息【消息推送】


參考:
(23條消息) Python訂閱Redis主題,實現前端通過Websocket實時獲取訂閱信息【消息推送】_YelloooBlue's Blog-CSDN博客]

終極解決方案
第二天起來清醒了一點,靈光一現
既然redis老是死循環,那我們能不能照葫蘆畫瓢,弄個異步的redis訂閱?
又惡補了一下異步的知識,上網找答案
功夫不負有心人,找到個aioredis異步redis庫

咋實現異步訂閱嘞?這次直接在Google上搜了一下
發現了老外的一篇文章
wok,這不就是我要的嗎,趕緊copy一下試試

# producer.py

import asyncio
from aioredis import create_connection, Channel
import websockets

async def subscribe_to_redis(path):
    conn = await create_connection(('localhost', 6379))

    # Set up a subscribe channel
    channel = Channel('lightlevel{}'.format(path), is_pattern=False)
    await conn.execute_pubsub('subscribe', channel)
    return channel, conn


async def browser_server(websocket, path):
    channel, conn = await subscribe_to_redis(path)
    try:
        while True:
            # Wait until data is published to this channel
            message = await channel.get()

            # Send unicode decoded data over to the websocket client
            await websocket.send(message.decode('utf-8'))

    except websockets.exceptions.ConnectionClosed:
        # Free up channel if websocket goes down
        await conn.execute_pubsub('unsubscribe', channel)
        conn.close()

if __name__ == '__main__':
    # Runs a server process on 8767. Just do 'python producer.py'
    loop = asyncio.get_event_loop()
    loop.set_debug(True)
    ws_server = websockets.serve(browser_server, 'localhost', 8767)
    loop.run_until_complete(ws_server)
    loop.run_forever()

調試了一下,完美,多客戶端也有了,redis訂閱也有了。

按照異步邏輯await,每有一個ws客戶端連接,python都會創建一個redis訂閱連接,果不其然,
在redis命令行測試的時候發現確實如此,會不會占用過多資源,還有待考究

可以說是實現了
websocket連接 轉換為 redis訂閱連接
也大致滿足了我的項目需求了

后期需求(進階)
redis只需要訂閱一次(一個訂閱鏈接)就可以實現對多個客戶端發送,以及客戶端session的判別

學習
異步IO又是一個大坑,不論是python的asyncio還是PHP的swoole,都還要學習,本文大概就到這里,記錄一下研究過過程,有特別多的不足,目前項目需要跟進,有些內容暫時沒法深入學習,還請見諒。

python服務器消息推送_Python Web實時消息后台服務器推送技術---GoEasy_weixin_39587407的博客-程序員宅基地 - 程序員宅基地]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM