#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())