【问题标题】:No speedup using asyncio despite awaiting API response尽管等待 API 响应,但使用 asyncio 没有加速
【发布时间】:2019-10-30 03:10:54
【问题描述】:

我正在运行一个程序,该程序从一个 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))

【问题讨论】:

  • 除了 Josh 的响应之外,您的 chain 协程被编写为等待三个下载依次。即使他们正确使用 asyncio,您也会获得顺序下载。要解决此问题(在切换到实际使用 Josh 指示的 asyncio 之后),chain 需要等待 gather(data(), indicator(), request(),并且只有 then 这三个将并行运行。使用单个协程调用 gather,就像在 main() 中所做的那样没有任何作用,相当于直接等待协程。

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


【解决方案1】:

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

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

【讨论】:

  • 啊,是的,我现在明白了。一直在阅读 aiohttp 文档并准备尝试一下,非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 2013-11-11
  • 2012-09-08
  • 1970-01-01
相关资源
最近更新 更多