Не получается в асинхронном режиме получать данные от сервера

Рейтинг: 0Ответов: 2Опубликовано: 27.06.2023

Проблема с асинхронным получением данных от сервера. Если синхронно через функцию обращаться к серверу, то программа замирает, пока не придет какой-то ответ. При оборачивании функции в Task работает асинхронно, но не выдает ответы от сервера. Выдает только первый ответ (в примере def send_msg). Что я делаю не так?

import asyncio
import websockets
import json
import time

def channel_msg(ch_send):

msg = \
    {"jsonrpc": "2.0",
     "method": "public/subscribe",
     "id": 42,
     "params": {
         "channels": ch_send

     }
     }

    return msg

async def connect():
    global websocket
    websocket = await websockets.connect('wss://test.deribit.com/ws/api/v2')

async def send_msg(message):
    await websocket.send(json.dumps(message))
    return

async def recv():

    return await websocket.recv()

async def main():
    await connect()
    ch_send = ["book.BTC-PERPETUAL.none.10.100ms"]
    msg = channel_msg(ch_send)
    await send_msg(msg)
    task = asyncio.create_task(recv())
    await task

    while True:

        print(await task) #здесь через task

        # print(await recv()) #здесь через синхронную функцию

        print(f"{time.strftime('%H:%M:%S', time.localtime(time.time()))}")

asyncio.run(main())

Ответы

▲ 1

print(await recv()) это асинхронная функция. правильно через неё, таск не нужен в этом коде.

▲ 0

Синхронный вызов функций - это когда каждая последующая функция вызывается строго после предыдущей.

Асинхронный вызов функций - когда следующие функции вызываются не дожидаясь завершения предыдущих.

То, что Вы перед описанием каждой функции в Вашей программе поставили слово async, отнюдь не сделало эту программу асинхронной. Потому, что перед вызовом каждой следующей функции Вы используете await. И это не зависит от того, как Вы запускаете функцию - явно, или через задачу. Это определяется логикой Вашего кода, а не чем-то другим.

Выдает только первый ответ

А почему должно быть ответов больше одного? Внутри цикла стоит только чтение. А сервер (любой) всегда только отвечает на запрос. А запрос - это операция записи (отправки сообщения) на сервер.