Могу ли я подключиться к двум различным серверам веб-сокетов одновременно в Python? - PullRequest
0 голосов
/ 04 ноября 2018

Мне нужно подключиться к двум серверам веб-сокетов одновременно, используя python, так как мне нужно объединить данные, полученные от каждого из них, в один файл и затем обработать его. Я использовал что-то , например , следующее успешно для одного канала веб-сокетов, но не могу заставить его работать для двух каналов одновременно:

from websocket import create_connection

ws_a = create_connection("wss://www.server1.com")
ws_a.send("<subscription message, server 1>")

ws_b = create_connection("wss://www.server2.com")
ws_b.send("<subscription message, server 2>")

while bln_running:
    response_a =  ws_a.recv()

    if "success" in response_a:
        ...do something...

    response_b =  ws_b.recv()
    if "success" in response_b:
        ...do something...

Однако в этом примере я получаю события только от сервера 1. Не думаю, что разделение его на два потока будет работать, так как у меня тогда есть два разных набора данных, и мне нужно их объединить. (Хотя оспаривание этого утверждения является возможным альтернативным решением ???)

Приветствуются любые рекомендации или советы по получению обоих каналов одновременно.

Большое спасибо.

Моя версия на питоне: 3.6.2 | Пользовательский Anaconda (64-разрядная версия) | (по умолчанию 19 сентября 2017 г., 08:03:39) [MSC v.1900 64 бит (AMD64)]

1 Ответ

0 голосов
/ 04 ноября 2018

Это сработало:

from websocket import create_connection
from threading import Lock, Thread

lock = Lock()
message_list = [] #global list

def collect_server1_data():
    global message_list
    bln_running = True
    ws_a = create_connection("wss://www.server1.com")
    ws_a.send("<subscription>")
    while bln_running:   
        response_a =  ws_a.recv()
        lock.acquire()
        message_list.append(response_a)
        lock.release()
        response_a = ""

def collect_server2_data(): 
    global message_list
    bln_running = True
    ws_b = create_connection("wss://www.server2.com")
    ws_b.send("<subscription>")
    while bln_running:   
        response_b =  ws_b.recv()
        lock.acquire()
        message_list.append(response_b)
        lock.release()
        response_b = ""


### --------Main--------
threads = []
for func in [collect_server1_data, collect_server2_data]:
    threads.append(Thread(target=func))
    threads[-1].start()

for thread in threads:
    thread.join() 

Спасибо JohanL за правильное направление.

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