我一直在使用 websockets 和 asyncio 來獲取從 Bitstamp 流式傳輸的價格資料。連接到 websockets 提要后,我正在努力回傳接收到的資料以用于另一個函式。我目前正在使用該函式store_data()作為占位符來檢查回傳的價格資料。
我想出了一種相當粗略的存盤價格的方法,其中包括宣告全域變數bitstamp_asks,然后在 websocketswhile回圈中覆寫它。
我覺得必須有更好的方法,所以任何幫助都會非常感激。我的代碼如下:
import asyncio
import websockets
import json
bitstamp_asks = []
async def bitstamp_connect():
global bitstamp_asks
uri = "wss://ws.bitstamp.net/"
subscription = {
"event": "bts:subscribe",
"data": {
"channel": "order_book_btcusd"
}
}
async with websockets.connect(uri) as ws:
await ws.send(json.dumps(subscription))
subscription_response = await ws.recv()
print(json.loads(subscription_response)['event'])
while True:
response = await ws.recv()
bitstamp_data = json.loads(response)['data']
bitstamp_asks = float(bitstamp_data['asks'][0][0])
print(bitstamp_asks)
await asyncio.sleep(0.0001)
async def store_data():
while True:
print(f'The stored value is: {bitstamp_asks}')
await asyncio.sleep(0.1)
asyncio.get_event_loop().run_until_complete(asyncio.wait([bitstamp_connect(),store_data()]))
uj5u.com熱心網友回復:
您可以使用asyncio.Queue在任務之間共享值。例如:
import asyncio
import websockets
import json
q = asyncio.Queue()
async def bitstamp_connect():
uri = "wss://ws.bitstamp.net/"
subscription = {
"event": "bts:subscribe",
"data": {"channel": "order_book_btcusd"},
}
async with websockets.connect(uri) as ws:
await ws.send(json.dumps(subscription))
subscription_response = await ws.recv()
print(json.loads(subscription_response)["event"])
last_value = None
while True:
response = await ws.recv()
bitstamp_data = json.loads(response)["data"]
bitstamp_asks = float(bitstamp_data["asks"][0][0])
if last_value is None or bitstamp_asks != last_value:
q.put_nowait(bitstamp_asks)
last_value = bitstamp_asks
async def store_data():
while True:
data = await q.get()
print(f"The stored value is: {data}")
q.task_done()
asyncio.get_event_loop().run_until_complete(
asyncio.wait([bitstamp_connect(), store_data()])
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/493910.html
