websoket на python

Написал websoket, который непрерывно получает цену.

async def TickersChannel_ws():

    """ Websoket подписка на цены"""
    url = "wss://ws.okx.com:8443/ws/v5/public"
    async with websockets.connect(url) as ws:

        subs = {
            "op": "subscribe",
            "args": [
                dict(channel="mark-price", instId="NOT-USDT-SWAP")
            ]
        }

        await ws.send(json.dumps(subs))

        async for msg in ws:
            msg = json.loads(msg)
            if "event" not in msg:
                return msg.get("data")[0].get("markPx")

Мне теперь совсем непонятно, как сделать чтобы также в непрерывном потоке сравнивать цену из подписки asyncio.run(TickersChannel_ws()) с заданным числом к примеру. while True не вариант, потому что получается, что он постоянно переконекчивается к серверу, что теряет смысл сокета.

Я понимаю, что надо условно записывать в переменную, а потом сравнивать, но так у меня тоже не получается, потомучто сокет непрерывно идет.


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

Автор решения: Сергей Ш
import json
import asyncio
import websockets


async def TickersChannel_ws():
    url = "wss://ws.okx.com:8443/ws/v5/public"
    async with websockets.connect(url) as ws:

        subs = {
            "op": "subscribe",
            "args": [
                dict(channel="mark-price", instId="NOT-USDT-SWAP")
            ]
        }

        await ws.send(json.dumps(subs))

        async for msg in ws:
            msg = json.loads(msg)
            if "event" not in msg:
                yield msg.get("data")[0].get("markPx")


async def main():
    async for ticker in TickersChannel_ws():
        print(ticker)


asyncio.run(main())
→ Ссылка