python - 尽管等待 API 响应,但使用 asyncio 没有加速

标签 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))

最佳答案

不幸的是,asyncio不是魔法。尽管您已将它们放入 async函数,BitMEXData().get_<foo>函数本身不是异步的(即你不能await它们),因此在它们运行时会阻塞。 asyncio中的并发数只能在 await 时发生正在做一些事情。

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

关于python - 尽管等待 API 响应,但使用 asyncio 没有加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56615813/

相关文章:

javascript - 为什么我会通过 await Promise.all 收到未处理的 Promise Rejection

python - PyCrypto 和 GMP 库未找到错误 [Mac OS 10.6.3]

python - 有没有一种在 Python 中使用二进制数的简单方法?

linux - 如何在 Python 中找到闪存驱动器自动挂载的位置?

swift - 使用 Swift 在 Firebase 中完成异步任务

c - 使 udp 套接字成为非阻塞

python - 如何使用 python regex 将正则表达式与其中的一个数字完全匹配?

python - 最简单的python相当于R的gsub

javascript - Python Eventlet + Javascript Websocket 返回 Blob

python - ValueError : When changing to a larger dtype, 其大小必须是数组最后一个轴的总大小(以字节为单位)的除数