gpt4 book ai didi

python asyncio - 运行时错误 : await wasn't used with future

转载 作者:行者123 更新时间:2023-12-03 23:47:29 34 4
gpt4 key购买 nike

我想使用带有 gather() 的信号量来限制 api 调用。我想我必须使用 create_task() 但我得到一个运行时错误:“RuntimeError:await 未与 future 一起使用”。我该如何解决?

这是代码:

import asyncio
# pip install git+https://github.com/sammchardy/python-binance.git@00dc9a978590e79d4aa02e6c75106a3632990e8d
from binance import AsyncClient


async def catch_up_aggtrades(client, symbols):
tasks = asyncio.create_task(get_historical_aggtrades(client, symbol) for symbol in symbols)
sem = asyncio.Semaphore(1)
async with sem:
await asyncio.gather(*tasks)


async def get_historical_aggtrades(client, symbol):
async for trade in client.aggregate_trade_iter(symbol, '1 day ago UTC'):
print(f"symbol {symbol}")


async def main():
client = await AsyncClient.create()
symbols = ['BTCUSDT', 'ETHUSDT', 'BNBUSDT']
await catch_up_aggtrades(client, symbols)


if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

最佳答案

限制资源使用的信号量实际上是一个非常简单的概念。这类似于计算免费 parking 场。 (汽车进入时-1,离开时+1)。当计数器降为零时,等待的汽车队列开始建立。

这意味着:

  • 每个资源一个信号量
  • 初始值=并发资源用户上限
  • 每个资源使用由 async with sem: 保护

  • 现有代码:
    sem = asyncio.Semaphore(1)
    async with sem:
    await asyncio.gather(*tasks)

    限制使用 asyncio.gather一次收集 1 个任务。它不限制任务,只限制他们的聚会。自 gather无论如何只调用一次,信号量不会改变任何东西。

    您的程序可能会更改为(包括评论中解决的问题):
    LIMIT = 1

    async def catch_up_aggtrades(client, symbols):
    sem = asyncio.Semaphore(LIMIT)
    tasks = [asyncio.create_task(get_historical_aggtrades(client, symbol, sem)) for symbol in symbols]
    await asyncio.gather(*tasks)

    async def get_historical_aggtrades(client, symbol, sem):
    async with sem:
    async for trade in client.aggregate_trade_iter(symbol, '1 day ago UTC'):
    print(f"symbol {symbol}")

    关于python asyncio - 运行时错误 : await wasn't used with future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61776830/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com