Доступ к входящим сообщениям с помощью клиента Python websocket - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь получать сообщения через модуль 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. Что я могу сделать, чтобы сделать эту работу?

1 Ответ

1 голос
/ 01 мая 2020

Не уверен, что это самый подходящий ответ, но нашел способ сделать эту работу.

import queue
.
.
.
.

    def on_message(ws, message):
            current_price = message
            q.put(current_price)
    .
    .
    .

    ws_thread.start()

    while True:
        print(q.get())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...