參考:
(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的博客-程序員宅基地 - 程序員宅基地]
