Нет ускорения при использовании asyncio, несмотря на ожидание ответа API - PullRequest
1 голос
/ 16 июня 2019

Я запускаю программу, которая делает три разных запроса от API отдыха. data, индикатор, запрос выполняет все функции извлечения данных из API BitMEX, используя созданную мной оболочку.

Я использовал asyncio, чтобы попытаться ускорить процесс, так что, пока я жду ответа от предыдущего запроса, он может начать делать еще один.

Однако по какой-то причине моя асинхронная версия не работает быстрее. Код работает, и, насколько я знаю, я все правильно настроил. Но может быть что-то не так с тем, как я настраиваю сопрограммы?

Вот асинхронная версия:

import time
import asyncio

from bordemwrapper import BitMEXData, BitMEXFunctions


'''
asynchronous I/O
'''

async def data():
    data = BitMEXData().get_ohlcv(symbol='XBTUSD', timeframe='1h', 
                                  instances=25)
    await asyncio.sleep(0)
    return data

async def indicator():
    indicator = BitMEXData().get_indicator(symbol='XBTUSD', 
        timeframe='1h', indicator='RSI', period=20, source='close', 
        instances=25)
    await asyncio.sleep(0)
    return indicator

async def request():
    request = BitMEXFunctions().get_price()
    await asyncio.sleep(0)
    return request

async def chain():
    data_ = await data()
    indicator_ = await indicator()
    request_ = await request()
    return data_, indicator_, request_

async def main():
    await asyncio.gather(chain())

if __name__ == '__main__':
    start = time.perf_counter()
    asyncio.run(main())
    end = time.perf_counter()

    print('process finished in {} seconds'.format(end - start))

1 Ответ

3 голосов
/ 16 июня 2019

К сожалению, asyncio не волшебство.Хотя вы поместили их в функции async, функции BitMEXData().get_<foo> сами по себе не являются асинхронными (т. Е. Вы не можете await их), и поэтому блокируются во время их работы.Параллелизм в asyncio может происходить только при await вводе чего-либо.

Вам понадобится библиотека, которая выполняет фактические HTTP-запросы асинхронно, например aiohttp .Похоже, вы написали bordemwrapper сами - вам следует переписать функции get_<foo>, чтобы использовать асинхронные HTTP-запросы.Не стесняйтесь задавать отдельный вопрос, если вам нужна помощь в этом.

...