Получение данных с 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()

он недоделанный, задумка простая, записывать данные в атрибуты класа и обращаться напрямую к атрибутам для получения результатов которые актуальные на данный момент. Есть ли способ сделать это по-другому?


Ответы (0 шт):