Celery + Python:在另一个任务中排队耗时的任务

时间:2017-09-03 22:16:03

标签: python celery django-celery

我想查询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

我的问题是,当多个请求进入时,第二个请求会在第一个请求完成后还是第一个请求仍在运行时执行?当他们没有同时执行时,我怎么能实现这个目标呢?

2 个答案:

答案 0 :(得分:2)

您不应该使用time.sleep,而是率限制您的任务:

  

Task.rate_limit

     

设置此任务类型的速率限制(限制   可在给定时间范围内运行的任务数量。)

     

速率限制可以用秒,分钟或小时来指定   在值上附加“/ s”,“/ m”或“/ h”。任务将是均匀的   在指定的时间范围内分发。

     

示例:“100 / m”(每分钟100个任务)。这将强制执行最低限度   在同一工作者实例上启动两个任务之间延迟600毫秒。

因此,如果您想将其限制为每秒1个查询,请尝试以下方法:

@shared_task(rate_limit='1/s')
def query_api_multiple(values):
    ...

答案 1 :(得分:1)

是的,如果您创建了多个任务,那么它们可能会同时运行。

如果要限制每段时间运行的任务数,可以使用芹菜对任务类型进行速率限制。或者,如果您需要比芹菜提供的OOtB更多的灵活性,您可以使用redis和celery重试之类的东西来实现速率限制模式。