python - 任务之间的异步等待
问题描述
我想在每组 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)
谢谢
解决方案
您需要使用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())
推荐阅读
- apache-spark - 在 Apache Livy 中使用 logback.xml
- regex - 宏 Vim - 扩展多个 Verilog 总线
- c++ - 使用 g++ 包含来自不同文件夹的头文件
- xamarin - XML 格式不正确(无效标记)
- angular - 带有 ID 的 Angular 子路由不执行任何操作
- python - Pymongo如何将辅助与主同步
- javascript - javascript,将月份和年份分配给对象
- angular - 带有过滤器的Angular 7 mat自动完成功能不起作用
- xamarin.forms - Xamarin 渲染速度
- ffmpeg - 如何将 mp4 转换为 HLS 并使用 ffmpeg 将字幕添加到主播放列表