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

2024-10-05 17:49:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在运行一个从restapi发出三个不同请求的程序。data、indicator、request函数都使用我制作的包装器从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))

Tags: import版本asynciodatagetasyncreturntime
1条回答
网友
1楼 · 发布于 2024-10-05 17:49:07

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

您将需要一个库来异步生成实际的HTTP请求,如aiohttp。听起来像是你自己写的bordemwrapper你应该重写get_<foo>函数来使用异步HTTP请求。如果你需要帮助,可以单独提出一个问题。在

相关问题 更多 >