我可以用python同时连接到两个不同的WebSocket服务器吗?

我可以用python同时连接到两个不同的WebSocket服务器吗?,python,websocket,Python,Websocket,我需要使用python同时连接到两个WebSocket服务器,因为我需要将从每个服务器接收的数据合并到一个文件中,然后对其进行处理。我在一个websockets提要中成功地使用了如下内容,但无法同时在两个提要中使用: from websocket import create_connection ws_a = create_connection("wss://www.server1.com") ws_a.send("<subscription message, server 1>"

我需要使用python同时连接到两个WebSocket服务器,因为我需要将从每个服务器接收的数据合并到一个文件中,然后对其进行处理。我在一个websockets提要中成功地使用了如下内容,但无法同时在两个提要中使用:

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...
从websocket导入创建\u连接
ws\u a=创建\u连接(“wss://www.server1.com")
ws_a.send(“”)
ws_b=创建_连接(“wss://www.server2.com")
ws_b.send(“”)
bln_运行时:
response_a=ws_a.recv()
如果回答a中的“成功”:
…做点什么。。。
response_b=ws_b.recv()
如果响应中的“成功”:
…做点什么。。。
但是,在本例中,我只从服务器1接收事件。我不认为把它分成两个线程会起作用,因为我有两组不同的数据,我需要合并它们。(尽管质疑此声明是一种可能的替代解决方案??)

任何关于同时获得两个提要的指导或建议都值得赞赏

非常感谢

我的python版本:3.6.2 | Anaconda custom(64位)|(默认值,2017年9月19日,08:03:39)[MSC v.1900 64位(AMD64)]

这起作用了:

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() 
从websocket导入创建\u连接
从线程导入锁,线程
lock=lock()
消息列表=[]全局列表
def收集_服务器1_数据():
全局消息列表
bln_running=True
ws\u a=创建\u连接(“wss://www.server1.com")
ws_a.send(“”)
bln_运行时:
response_a=ws_a.recv()
lock.acquire()
消息列表。追加(响应)
lock.release()
响应_a=“”
def收集_服务器2_数据():
全局消息列表
bln_running=True
ws_b=创建_连接(“wss://www.server2.com")
ws_b.send(“”)
bln_运行时:
response_b=ws_b.recv()
lock.acquire()
消息列表。追加(响应)
lock.release()
响应_b=“”
###-----主要--------
线程=[]
对于[收集服务器1\u数据,收集服务器2\u数据]中的func:
附加(线程(目标=func))
线程[-1]。开始()
对于线程中的线程:
thread.join()

感谢JohanL向正确方向的引导。

即使要组合输入流,您也可以很好地使用线程。你必须以某种方式确保他们的秩序,但无论如何你都需要。否则您可以使用
asyncio
或者,我想,
select.select
。谢谢Johan。如果线程结束,我会这样做,但我不知道如何在线程仍在运行时将接收到的数据传递出去。在C#中,我会(可能不公平地)创建一个全局变量,并将值传递给该变量。在Python中我也会这样做吗?如果是这样,怎么做?查看
队列
模块。(). 这是在线程之间传递消息的好方法。