【问题标题】:How to speedup FTX API call using asyncio?如何使用 asyncio 加速 FTX API 调用?
【发布时间】: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


【解决方案1】:

所以,显然我需要在 loop.run_in_executor() 中将阻塞函数 async get_next_funding(df) 作为 SYNC 函数执行,因为阻塞 fcn 不是异步类型。

感谢@gold_cy 的回答!

有修改后的代码:

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
    return df


async def await_for_df(df_):

    loop = asyncio.get_running_loop()
    r = await loop.run_in_executor(None, get_next_funding, df_)
    return r

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-30
    • 2021-08-12
    • 2022-11-23
    • 2022-06-18
    • 2022-06-29
    • 2022-07-15
    • 1970-01-01
    • 2022-08-18
    相关资源
    最近更新 更多