У меня следующий код:
async def get_balance(exchange, symbol='BTC/USD'):
freeBalance = await exchange.fetchBalance()
symbol1_balance = freeBalance[symbol.split('/')[0]]
symbol2_balance = freeBalance[symbol.split('/')[1]]
return symbol1_balance, symbol2_balance
async def get_balances(exchanges):
futures = [get_balance(exchange) for exchange in exchanges]
balances = await asyncio.gather(*futures)
return balances
exchanges = [exchange1, exchange2, ...]
loop = asyncio.get_event_loop()
results = loop.run_until_complete(get_balances(exchanges))
Но я получаю сообщение об ошибке:
res = l oop .run_until_complete (get_balances (exchange, symbol))
Отслеживание (последний вызов последним):
Файл «C: \ Users \ Nicolas \ Anaconda3 \ lib \ asyncio \ base_events.py», строка 570, в run_until_complete self.run_forever ( )
Файл "C: \ Users \ Nicolas \ Anaconda3 \ lib \ asyncio \ base_events.py", строка 525, в run_forever поднять RuntimeError ('Это событие l oop уже запущено')
RuntimeError: это событие l oop уже запущено
main : 49: RuntimeWarning: coroutine 'binance.fetch_balance' никогда не ожидалось RuntimeWarning: включить tracemallo c чтобы получить трассировку выделения объекта
main : 49: RuntimeWarning: сопрограмма 'bitfinex.fetch_balance' никогда не ожидалась RuntimeWarning: включить tracemallo c, чтобы получить трассировку выделения объекта
Для ясности: print (exchange [0] .fetchBalance ())
* 10 27 *
Итак, функция get_balance уже является сопрограммой.
Мне удалось запустить первую asyncio-example-gather , за исключением того, что вместо
asyncio.run(main())
Файл «C: \ Users \ Nicolas \ Anaconda3 \ lib \ asyncio \ runners.py», строка 34, при выполнении «asyncio.run () не может быть вызван из запущенного события l oop ")
RuntimeError: asyncio.run () не может быть вызван из запущенного события l oop
Но работает следующее:
loop = asyncio.get_running_loop()
res = loop.create_task(main())
Я хорошо разбирался в асинхронном программировании, раньше больше использовал многопоточность. Вы знаете, что здесь не так?
Спасибо, ребята!