Как подключиться к нескольким каналам с помощью многопроцессорной обработки websocket? - PullRequest
3 голосов
/ 10 июля 2019

Я написал скрипт, позволяющий собирать данные по разным каналам веб-сокетов, но мне не удается прослушать несколько каналов одновременно с этим скриптом.Я хотел бы найти решение, такое как «многопроцессорность» или «поток».

Мне удалось прослушать несколько каналов, несколько раз запустив скрипт на разных терминалах.Например, если я хочу прослушать 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))

Таким образом, я могу подписаться и прослушать все каналы, запустив только один скрипт.Но это на самом деле не помогает, потому что в каждом цикле мне приходится повторно подключаться к каналу, и если для ответа канала потребовалось много времени, я теряю много информации из других каналов, пока я не подключен к ним.

Может ли кто-нибудь помочь мне оптимизировать процесс?

...