我想用很多项目(〜100)查询API(耗时),但不是全部。相反,我想要查询之间的一点延迟。
我目前的任务是异步执行的,并在查询上进行迭代,并且每次迭代等待一段时间:
@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
我的问题是,当这些请求中的多个进来时,第二个请求在第一个请求完成后还是在第一个请求仍在运行之后执行?当他们不同时执行时,我该如何实现?
您不应该使用time.sleep
,而应限制任务:
Task.rate_limit
设置此任务类型的费率限制(限制 可以在给定时间范围内运行的任务数量)。
可以通过几秒钟,分钟或小时来指定速率限制 将"/s","/m"或"/h"附加到值。任务将均匀 分布在指定的时间范围内。
示例:" 100/m"(每分钟一百个任务)。这将使最低 在同一工人实例上启动两个任务之间的延迟600ms。
因此,如果要将其限制为每秒1个查询,请尝试以下操作:
@shared_task(rate_limit='1/s')
def query_api_multiple(values):
...
是的,如果您创建多个任务,则可以同时运行。
如果要限制每个时间段内运行的任务数量,则可以使用芹菜对任务类型的限制进行评分。另外,您可以使用诸如redis之类的东西实现限制速率的模式,并结合芹菜的重试,如果您需要的灵活性比芹菜提供的更灵活。