Я пытаюсь получать сообщения через модуль 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()
При запуске этого кода будет напечатана текущая цена Bitcoin (current_price
), когда они поступят через веб-сокет.
Далее я хочу получить доступ к этой переменной current_price
вне функции websocket, и здесь у меня возникли трудности. Запись чего-либо, кроме ws.run_forever()
, будет игнорироваться, потому что событие websocket l oop никогда не закончится.
Поэтому я попытался запустить websocket в отдельном потоке с модулем 'threading':
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
. Что я могу сделать, чтобы сделать эту работу?