как получить данные асинхронной функции в 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 шт):
Если я правильно понял вопрос, то речь о том, чтоб разделить программу на два компонента:
- коннектор, который в цикле читает данные
- процессор, который получает данные из коннектора, и их обрабатывает
Один вариант, это создать асинхронный генератор:
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, как в примере.