Возвращать результаты с помощью asyncio - PullRequest
1 голос
/ 19 июня 2020

У меня следующий код:

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

Я хорошо разбирался в асинхронном программировании, раньше больше использовал многопоточность. Вы знаете, что здесь не так?

Спасибо, ребята!

...