Я написал скрипт, позволяющий собирать данные по разным каналам веб-сокетов, но мне не удается прослушать несколько каналов одновременно с этим скриптом.Я хотел бы найти решение, такое как «многопроцессорность» или «поток».
Мне удалось прослушать несколько каналов, несколько раз запустив скрипт на разных терминалах.Например, если я хочу прослушать 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))
Таким образом, я могу подписаться и прослушать все каналы, запустив только один скрипт.Но это на самом деле не помогает, потому что в каждом цикле мне приходится повторно подключаться к каналу, и если для ответа канала потребовалось много времени, я теряю много информации из других каналов, пока я не подключен к ним.
Может ли кто-нибудь помочь мне оптимизировать процесс?