как получить данные асинхронной функции в python

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

Вот код класса, который получает данные с биржи

class StreamDataConnector:
    '''Object constructor'''
    '''@.param symbol: str
       @:param interval: str
    '''
    def __init__(self, symbol, interval):
        self.symbol = symbol
        self.interval = interval

        async def connerctor():
          
            url = f"wss://stream.binance.com:9443/stream?streams={self.symbol}@kline_{self.interval}"

            async with websockets.connect(url) as client:
                while True:
                    data = json.loads(await client.recv())['data']
                    print(data)

        loop = asyncio.get_event_loop()
        loop.run_until_complete(connerctor())

Данные идут в непрерывном потоке

Я думал как то записывать в файл данные эти и читать этот файл параллельно, но это по моему не то. Подскажите пожалуйста, как это правильно делать, спасибо


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

Автор решения: Roman-Stop RU aggression in UA

Если я правильно понял вопрос, то речь о том, чтоб разделить программу на два компонента:

  1. коннектор, который в цикле читает данные
  2. процессор, который получает данные из коннектора, и их обрабатывает

Один вариант, это создать асинхронный генератор:

import asyncio

class StreamDataConnector:
    async def get_data(self):
        i = 0
        while True:
            i += 1                     # это имитация получения
            await asyncio.sleep(1)     # данных
            yield i

class Processor:
    async def process(self, connector):
        async for data in connector.get_data():
            # тут обрабатываем, в этом примере просто печатаем
            print(data)


async def main():
    connector = StreamDataConnector()
    processor = Processor()

    await asyncio.create_task(processor.process(connector))

asyncio.run(main())

Тут цикл, в котором i увеличивается на 1 и делается sleep имитирует получение новых данных. У вас в get_data должно быть то, что сейчас в connerctor т.е. открытие сокета и чтение, только вместо print делайте yield, как в примере.

→ Ссылка