我正在異步運行兩個回圈,并希望兩個回圈都能訪問同一個websocket連接。一個函式periodic_fetch()周期性地獲取一些資料(每60秒),并在滿足條件時向websocket發送一條訊息。另一個retrieve_websocket()接收來自websocket的訊息,并在滿足條件的情況下執行一些行動。目前,我在兩個函式中都連接到了websocket,但這意味著retrieve_websocket()將不會收到periodic_fetch()發送的websocket訊息的回應。我如何創建一個 websocket 連接并在兩個回圈中使用同一個連接,因為它們是異步運行的?我的代碼:
# Imports。
import asyncio
import websockets
from datetime import datetime
websocket_url = "wss://localhost:5000/"/span>
# 模擬獲取一些資料
async def fetch_data() 。
print("Fetching started"/span>)
await asyncio.sleep(2)
return {"data": 2}。
# 接收并分析websocket資料。
async def retrieve_websocket() 。
async with websockets.connect(websocket_url) as ws:
while True:
msg = await ws.recv()
print(msg)
# Perform some task if condition is met(條件滿足時,執行一些任務)
# 定期獲取資料并發送訊息到websocket。
async def periodic_fetch() 。
async with websockets.connect(websocket_url) as ws:
while True:
print(datetime.now())
fetch_task = asyncio.create_task(fetch_data() )
wait_task = asyncio.create_task(asyncio.sleep(60)
res = await fetch_task
# 發送訊息到websocket。
await ws.send("Websocket message"/span>)
# 等待剩余的等待時間。
await wait_task
loop = asyncio.get_event_loop()
cors = asyncio.wait([periodic_fetch(), retrieve_websocket()] )
loop.run_until_complete(cors)
uj5u.com熱心網友回復:
解決方案是在一個單獨的函式中打開連接,并使用asyncio.gather()傳入兩個以websocket為引數的函式。
async defrun_script()。
async with websockets.connect(websocket_url) as ws。
while True:
await asyncio.gather(periodly_fetch(ws), retrieve_websocket(ws))
asyncio.run(run_script())
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318039.html
標籤:
上一篇:遍歷html表并計算值
下一篇:如何宣告和等待一個異步委托?
