首页 > 解决方案 > 任务之间的异步等待

问题描述

我想在每组 50 个任务之间等待以遵守 API 请求的限制,但睡眠不起作用。你有想法吗。这是我的代码:

nb_tasks = len(tasks)
nb_page = (nb_tasks // 50) + 1

for i in range(nb_page):
    if (i + 1 * 50) < nb_tasks:
        tasks_to_play = tasks[i * 50: -1]
    else:
        tasks_to_play = tasks[i * 50: i + 1 * 50]

    print("TIME : " + str(config.time_to_reset))

    asyncio.gather(*tasks_to_play)
    time.sleep(config.time_to_reset)

谢谢

标签: pythonrequestpython-asynciothread-sleep

解决方案


您需要使用asyncio.sleep而不是time.sleep,但是您的逻辑并不能完全实现您的目标,例如,如果端点的速率限制为每秒 50,但您asyncio.gather(...)需要 5 秒才能完成,您不仅错过了 200 额外您可以安排请求,但即使在它们完成之后,您也会在发出更多请求之前睡觉并浪费更多时间

您可以像使用 a 那样将它们安排在块中,gather但我认为简单地将它们以恒定的间隙分散并收集结果要干净得多,即

RATE_LIMIT_PER_SECOND = 50

async def main():
    many_tasks = ...
    pending_tasks = list()
    for task in many_tasks:
        pending_tasks.append(asyncio.create_task(task))
        await asyncio.sleep(1 / RATE_LIMIT_PER_SECOND)
    results = await asyncio.gather(*pending_tasks)
    print(results)

asyncio.run(main())

推荐阅读