Получение данных с websocket
Здраствуйте, помогите пожалуйста с решением. Я попытаюсь обьяснить максимально просто задачу и кину код, буду очень благодарен за любую помощь. Задача следующая: получать данные из вебсокета в корутине. К корутине будут частые обращения. Она должна возвращать значение определенной валюты. В параметры корутины передается валюта и название, валюты часто меняется. Котировки поступают с вебсокета.
Тоесть идёт запрос к корутине -> обращение к вебсокету и получение нужных данных -> возвращение нужного значения.Максимально важна скорость .
Я решил открыть раз соединение с вебсокетом и обращаться по-необходимости. Так как к корутине очень частые обращения то от вебсокета нет смысла отключаться.
Пробовал разными способами, писал генераторы. Что-то примерно
async for i in websocets:
if i ....:
yield i
но в итоге мне возвращались старые значения. Пробовал через socket recv() но тоже самое. В результате пришёл к этому коду:
class SocketConnector:
_link = "socket_link"
data: float = None
websocket = None
@classmethod
async def reconnect(cls) -> None:
await cls.disconnect()
await cls.connect()
@classmethod
async def disconnect(cls) -> None:
if cls.websocket:
await cls.websocket.close()
cls.websocket = None
@classmethod
async def connect(cls) -> None:
cls.websocket = await websockets.connect(cls._link)
@classmethod
async def get_data(cls, trigger: str) -> float:
if not cls.websocket:
await cls.connect()
async for message in cls.websocket:
try:
obj = ujson.loads(message)
print(obj)
if obj['ticker'] == trigger:
cls.data = obj['spot']
except:
cls.data = None
await cls.reconnect()
@classmethod
async def getter(cls):
if not cls.data:
return cls.data
else:
await cls.reconnect()
он недоделанный, задумка простая, записывать данные в атрибуты класа и обращаться напрямую к атрибутам для получения результатов которые актуальные на данный момент. Есть ли способ сделать это по-другому?