python异步IO运行时错误:未在future中使用await

2024-09-28 03:21:33 发布

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

我想使用带有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())

Tags: importclientloopasynciotaskgetasyncmain
1条回答
网友
1楼 · 发布于 2024-09-28 03:21:33

限制资源使用的sempahore实际上是一个非常简单的概念。这类似于计算免费停车场。(-1当汽车进入时,+1当它离开时)。当计数器降至零时,排队等候的车辆开始增多

这意味着:

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

现行守则:

sem = asyncio.Semaphore(1)
async with sem:
    await asyncio.gather(*tasks)

asyncio.gather的使用限制为一次只能收集一个任务。它不限制任务,只限制任务的收集。由于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}")

相关问题 更多 >

    热门问题