我想查询api(这很费时)有很多项目(~100),但不能一次查询。相反,我想在查询之间稍微延迟。
我目前拥有的是一个异步执行的任务,并在每次迭代等待一段时间后迭代查询:
@shared_task
def query_api_multiple(values):
delay_between_queries = 1
query_results = []
for value in values:
time.sleep(delay_between_queries)
response = query_api(value)
if response['result']:
query_results.append(response)
return query_results
我的问题是,当多个请求进入时,第二个请求会在第一个请求完成后还是第一个请求仍在运行时执行?当他们没有同时执行时,我怎么能实现这个目标呢?
答案 0 :(得分:2)
您不应该使用time.sleep
,而是率限制您的任务:
设置此任务类型的速率限制(限制 可在给定时间范围内运行的任务数量。)
速率限制可以用秒,分钟或小时来指定 在值上附加“/ s”,“/ m”或“/ h”。任务将是均匀的 在指定的时间范围内分发。
示例:“100 / m”(每分钟100个任务)。这将强制执行最低限度 在同一工作者实例上启动两个任务之间延迟600毫秒。
因此,如果您想将其限制为每秒1个查询,请尝试以下方法:
@shared_task(rate_limit='1/s')
def query_api_multiple(values):
...
答案 1 :(得分:1)
是的,如果您创建了多个任务,那么它们可能会同时运行。
如果要限制每段时间运行的任务数,可以使用芹菜对任务类型进行速率限制。或者,如果您需要比芹菜提供的OOtB更多的灵活性,您可以使用redis和celery重试之类的东西来实现速率限制模式。