尽管等待API响应,但仍未使用asyncio加速

时间:2019-06-16 03:20:41

标签: python python-3.x asynchronous async-await python-asyncio

我正在运行一个程序,该程序从rest api发出三个不同的请求。数据,指示器,请求函数都使用我制作的包装程序从BitMEX的api获取数据。

我已经使用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 个答案:

答案 0 :(得分:3)

不幸的是,asyncio不是魔术。尽管您已将它们放在async函数中,但是BitMEXData().get_<foo>函数本身并不异步(即您无法await它们),因此在它们运行时会阻塞。 asyncio中的并发只能在await进行某些操作时发生。

您将需要一个库,该库可以异步发出实际的HTTP请求,例如aiohttp。听起来您自己写了bordemwrapper -您应该重写get_<foo>函数以使用异步HTTP请求。如果您需要帮助,请随时提交一个单独的问题。