Подписаться на несколько каналов с помощью python веб-сокетов - PullRequest
0 голосов
/ 13 января 2020

Проблема состоит в том, чтобы найти простой способ подписки на несколько каналов с использованием одного websocket соединения в python.

Проблема очень проста, и существует несколько решений, однако большинство из них используют partial, и мы хотели бы ее избежать.

Ниже приведен пример отдельной подписки subscribe_message_1, и мы также хотели бы подписаться subscribe_message_2. Чтобы упростить задачу, приведем реальный пример с использованием kraken.

import sys
import json
import signal
from websocket import create_connection

def alarmfunction(signalnumber, frame):
    signal.alarm(1)

def open_channel(ws, subscribe_message):
    try:
        ws.send(subscribe_message)
    except Exception as error:
        print("Feed subscription failed (%s)" % error)
        ws.close()
        sys.exit(1)

    while True:
        api_data = ws.recv()

        api_data = json.loads(api_data)

        print(type(api_data))
        print(api_data)


    ws.close()
    sys.exit(1)

signal.signal(signal.SIGALRM, alarmfunction)

api_feed = "book"
api_symbol = "ETH/USD".upper() #sys.argv[1].upper()
api_symbol2 = "LTC/USD".upper() #sys.argv[1].upper()
api_depth = 10 #sys.argv[2]
api_domain = "wss://ws.kraken.com/"
api_book = {"bid":{}, "ask":{}}

try:
    ws = create_connection(api_domain)
except Exception as error:
    print("WebSocket connection failed (%s)" % error)
    sys.exit(1)

subscribe_message_1 = '{"event":"subscribe", "subscription":{"name":"%(feed)s", "depth":%(depth)s}, "pair":["%(symbol)s"]}' % {"feed":api_feed, "depth":api_depth, "symbol":api_symbol}
subscribe_message_2 = '{"event":"subscribe", "subscription":{"name":"%(feed)s", "depth":%(depth)s}, "pair":["%(symbol)s"]}' % {"feed":api_feed, "depth":api_depth, "symbol":api_symbol2}

open_channel(ws, subscribe_message_1)

1 Ответ

0 голосов
/ 13 января 2020

Нам нужно только дважды вызвать посылку, как показано ниже:

def open_channel(ws, subscribe_message, subscribe_message1):
    try:
        ws.send(subscribe_message)
        ws.send(subscribe_message1)
    except Exception as error:
        print("Feed subscription failed (%s)" % error)
        ws.close()
        sys.exit(1)

    while True:
        api_data = ws.recv()

        api_data = json.loads(api_data)

        print(type(api_data))
        print(api_data)


    ws.close()
    sys.exit(1)

open_channel(ws, subscribe_message_1, subscribe_message_2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...