【发布时间】: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