如何使用WebSocket多处理连接到多个渠道?

时间:2019-07-10 16:42:27

标签: python websocket python-multiprocessing python-asyncio python-multithreading

我编写了一个脚本,允许通过不同的Websocket渠道收集数据,但是我无法使用此脚本一次收听多个渠道。我想找到一种解决方案,例如“多处理”或“线程”。

我设法通过在不同终端上运行几次脚本来收听多个频道。 例如,如果我想收听10个频道,则以所需的频道作为输入参数启动脚本10次,但是我确信必须有一种更聪明,更简洁的方法来使用多处理或其他过程。 的确,如果我启动到许多终端,我的计算机开始会真的很慢,并且该程序的最终结果将是使用性能比我的笔记本电脑差的Raspberry Pi运行它。

脚本如下:

import websocket
import sys


def getData(uri, channel, pathCSV):

    ws = websocket.create_connection(uri)
    try:
        print("Sending data")
        ws.send(channel)
        print("Receiving...")
        result =  ws.recv()
        print ("Received '%s'" % result)
        while True:
            result =  ast.literal_eval(ws.recv())
            print("Received ast '%s'" % result)
            # Here is a function which write the collected data to 
            #  a CSV.
            exportDataToCSV(result, pathCSV)
    except websocket.WebSocketConnectionClosedException as e:
        print('This caught the exception')
        ws.close()
        # In case of error I simply relaunch the script
        getMarketData(uri, channel, pathCSV)
    except KeyboardInterrupt:
        ws.close()
        return(result)

pathCSV = "/path/to/CSV"
uri = "websocket adress"
channelList = ["channel1", "channel2", "channel3", "channel4", 
"channel5"]

#channel : for now I have to select one

while True:
        getData(uri, channel, pathCSV)

因此,问题是“我如何才能仅在旨在收集接收到的数据并将其写入CSV的脚本的一个实例中设法监听所有频道?”

如果您有任何想法要分享,请先谢谢您。

编辑:

我在“ asyncio”库中找到了一些信息,这些信息将我带到以下代码:

import asyncio
import websockets
import ast


uri = "websocket uri"
channelList = ["channel1", "channel2", "channel3", "channel4", 
               "channel5"]

async def getData(channelList):
    uri = "websocket uri"
    for channel in channelList:
        async with websockets.connect(uri) as ws:
                await ws.send(channel)
                print("Receiving...")
                result = await ws.recv() 
                # Confirmation ofsubscription 
                print ("Received '%s'" % result)    
                result =  ast.literal_eval(await ws.recv())  
                # Getting Data
                print("Received ast '%s'" % result)


asyncio.get_event_loop().run_until_complete(getData(channelList))

通过这种方式,我可以通过仅启动一个脚本来订阅和收听所有频道。 但这并没有真正的帮助,因为在每个循环中我都必须重新连接到该通道,并且如果某个通道花了很长时间来回答,那么我在未连接到其他通道时会丢失很多其他通道的信息。

有人可以帮助我优化流程吗?

0 个答案:

没有答案