我正在尝试通过websocket-client模块接收消息,并能够将接收到的消息用于其他目的(例如,根据传入的消息执行买入/卖出订单)。
以下是我目前所掌握的情况:
import websocket
import time
import json
def on_message(ws, message):
try:
current_price = json.loads(message)
print(current_price["price"]) # data type is dict.. only showing values for the key 'price'
except:
print("Please wait..")
time.sleep(1)
def on_error(ws, error):
print(error)
def on_close(ws):
print("### closed ###")
def on_open(ws):
sub_params = {'type': 'subscribe', 'product_ids': ['BTC-USD'], 'channels': ['ticker']}
ws.send(json.dumps(sub_params))
if __name__ == "__main__":
websocket.enableTrace(False)
ws = websocket.WebSocketApp("wss://ws-feed.pro.coinbase.com/",
on_open = on_open,
on_message = on_message,
on_error = on_error,
on_close = on_close)
ws.run_forever()
运行这段代码会打印出当前的比特币价格(current_price
),因为它们通过它的WebSocket提要进入。
接下来我想做的是能够在WebSocket函数之外访问变量current_price
,但我在这里遇到了困难。写任何超出ws.run_forever()
的内容都将被忽略,因为websocket事件循环永远不会结束。
所以我试着用“threading”模块在一个单独的线程上运行WebSocket:
import websocket
import json
import threading
current_price = 0
def on_message(ws, message):
global current_price
current_price = message
def on_error(ws, error):
print(error)
def on_close(ws):
print("### closed ###")
def on_open(ws):
sub_params = {'type': 'subscribe', 'product_ids': ['BTC-USD'], 'channels': ['ticker']}
ws.send(json.dumps(sub_params))
if __name__ == "__main__":
websocket.enableTrace(False)
ws = websocket.WebSocketApp("wss://ws-feed.pro.coinbase.com/",
on_open = on_open,
on_message = on_message,
on_error = on_error,
on_close = on_close)
ws_thread = threading.Thread(target = ws.run_forever)
ws_thread.start()
print(current_price)
它返回0
。我该怎么做才能使它工作呢?
2条答案
按热度按时间xn1cxnb41#
不 确定 这 是 不 是 最 合适 的 答案 , 但 找到 了 一 种 方法 , 使 这 一 工作 。
中 的 每 一 个
pkwftd7m2#
的关键是使用functools partials来 Package run_forever线程的回调函数。我构建了一个简单的多线程演示器: