возвращаемые значения asyncio.create_task() в цикле событий сообщений websocket

#python #websocket #python-asyncio #trading

Вопрос:

У меня проблема с python asyncio, связанная с выводом асинхронного метода вызова REST api посреди непрерывного асинхронного потока вывода websocket. Я написал несколько псевдокодов ниже, чтобы объяснить свою проблему.

Мой веб-сайт очень часто отправляет сообщения с биржи каждые 1-5 миллисекунд, но я понятия не имею, как правильно назначить новое значение wallet_balance .

Включение await wallet_balance в приведенном ниже коде заблокирует мой код на 250 мс, в то время как ответу потребуется время, чтобы вернуться. Если не использовать await wallet_balance , то wallet_balance теперь он становится объектом сопрограммы, а не плавающей точкой. wallet_balance будет следующим для нескольких сообщений: <Task pending name='Task-12' coro=<get_wallet_balances() running at....> и в конечном итоге станет <Task finished name='Task-12' coro=<get_wallet_balances() done> , как только будет получен ответ API.

Как мне справиться с этой проблемой asyncio, связанной с присвоением/возвратом значения wallet_balance только после получения ответа? (и, очевидно, без блокировки потоковой передачи сообщений websocket)

Статья по теме: https://sammchardy.github.io/async-binance-basics/

 async def get_wallet_balance():
     wallet_balance = await async_exchange.get_balances()
     return wallet_balance


async def main():
    wallet_balance = 999.9
    async with websockets.connect(WS_URL) as ws:
         while True:
              msg = await ws.recv()
              # print(msg)
              
              ### do normal synchronous operations with msg output here ###

              ### if some conditions met, make an async API call to query wallet balance ###
              if msg == "condition met":  
                  # if a trade has executed, I want to update the value of my wallet balance  
                  wallet_balance = asyncio.create_task(get_wallet_balance())
                  # await wallet_balance
                  

if __name__ == "__main__":
    asyncio.run(main())