【发布时间】:2022-03-12 22:21:57
【问题描述】:
我正在运行一个程序,该程序对数据框中的每一行进行相同的 API 调用。由于花费了相当长的时间,我决定尝试使用 asyincio 学习和实现异步版本。
我会将数据帧拆分为“N”个(在本例中为 3 个)较小的数据帧,并为每个数据帧创建一个协程,由主程序收集和等待。
这是我尝试过的:
async def get_next_funding(df):
for idx in df.index:
predicted_rate = ftx.get_future_stats(df.loc[idx]['name'])['nextFundingRate']
df.at[idx, 'nextFundingRate'] = predicted_rate
await asyncio.sleep(0.01)
return df
async def await_for_df(df_):
# await é quem promete que a funcao vai ser executada, dando a mesma
# para o event loop
await get_next_funding(df_)
return df_
async def main():
# array_split returns a LIST of dataframes: [df1, ..., dfN]
dfs = np.array_split(ftx.df, 3)
# Could I use [await_for_df(dfs[x]) for x in dfs] ?
results = await asyncio.gather(await_for_df(dfs[0]), await_for_df(dfs[1]), await_for_df(dfs[2]))
loop = asyncio.get_event_loop()
start = time.perf_counter()
asyncio.run(main())
end = time.perf_counter()
print('process finished in {} seconds'.format(end - start))
它可以工作,但它似乎不能并行运行,因为它所花费的时间与我的同步代码相同。我觉得函数 ftx.get_future_stats() 可能会阻塞一切。此类函数是标准 API 调用 (https://docs.ftx.com/#get-future-stats)。
我错过了什么?
【问题讨论】:
-
您需要使用docs.python.org/3/library/…,因为该 API 调用被阻塞
-
这是运行此代码的最聪明的方式吗?
-
您可以修改您的代码以使用我链接的内容或将
async全部废弃,只使用线程,特别是docs.python.org/3/library/… 进行调用 -
它有效!谢谢gold_cy!
标签: python rest asynchronous async-await python-asyncio