芹菜+;Python:在另一个任务中对耗时的任务进行排队
我想查询一个包含大量项(~100)但不是一次查询全部项的api(这很耗时)。相反,我希望查询之间有一点延迟 我目前的任务是异步执行并在查询上迭代,每次迭代后等待一段时间:芹菜+;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
@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。此速率限制仅适用于每个工作人员,或者他们要求您将此任务添加到队列中,然后只有一个工作进程处理该队列,或者根本不添加速率限制,是否有更好的方法处理此问题,即所有工作进程都遵守速率限制此速率限制仅适用于每个工作进程,要么他们要求您将此任务添加到队列,然后只有一个工作进程处理该队列,要么根本不添加速率限制,是否有更好的方法处理此问题,让所有工作进程都遵守速率限制