Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
芹菜+;Python:在另一个任务中对耗时的任务进行排队_Python_Celery_Django Celery - Fatal编程技术网

芹菜+;Python:在另一个任务中对耗时的任务进行排队

芹菜+;Python:在另一个任务中对耗时的任务进行排队,python,celery,django-celery,Python,Celery,Django Celery,我想查询一个包含大量项(~100)但不是一次查询全部项的api(这很耗时)。相反,我希望查询之间有一点延迟 我目前的任务是异步执行并在查询上迭代,每次迭代后等待一段时间: @shared_task def query_api_multiple(values): delay_between_queries = 1 query_results = [] for value in values: time.sleep(delay_between_querie

我想查询一个包含大量项(~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

我的问题是,当出现多个请求时,第二个请求是在第一个请求完成后执行,还是在第一个请求仍在运行时执行?当它们不能同时执行时,我如何才能做到这一点呢?

你不应该使用
时间。睡眠
而是限制你的任务:

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

速率限制可以通过以下方式以秒、分钟或小时为单位指定: 将“/s”、““/m”或“/h”追加到值。任务将平均分配 在指定的时间范围内分发

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

因此,如果要将其限制为每秒1个查询,请尝试以下操作:

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

您不应使用
时间。睡眠
,而应限制您的任务:

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

速率限制可以通过以下方式以秒、分钟或小时为单位指定: 将“/s”、““/m”或“/h”追加到值。任务将平均分配 在指定的时间范围内分发

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

因此,如果要将其限制为每秒1个查询,请尝试以下操作:

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

是的,如果创建多个任务,则它们可能同时运行


如果要限制每个时间段运行的任务数,可以使用芹菜对任务类型的限制进行评级。或者,如果您需要比芹菜提供的OOtB更大的灵活性,您可以使用redis之类的工具实现速率限制模式,并结合芹菜重试。

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


如果要限制每个时间段运行的任务数,可以使用芹菜对任务类型的限制进行评级。或者,如果您需要比芹菜提供的OOtB更大的灵活性,您可以使用redis之类的工具结合芹菜重试来实现速率限制模式。

您应该使用ETA–为以后安排任务,以便使用ETA(估计到达时间)异步执行此操作,例如:later=now+timedelta(小时=1)访问系统。应用异步((对象id),eta=later)eta。您应该使用eta–为以后安排任务,使用eta(估计到达时间)异步执行此操作,如:later=now+timedelta(小时=1)访问系统。应用异步((对象id,eta=later)eta。此速率限制仅适用于每个工作人员,或者他们要求您将此任务添加到队列中,然后只有一个工作进程处理该队列,或者根本不添加速率限制,是否有更好的方法处理此问题,即所有工作进程都遵守速率限制此速率限制仅适用于每个工作进程,要么他们要求您将此任务添加到队列,然后只有一个工作进程处理该队列,要么根本不添加速率限制,是否有更好的方法处理此问题,让所有工作进程都遵守速率限制