[英]Celery + Python: Queue time consuming tasks within another task
我想查询包含很多项目(〜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
而是对任务进行速率限制:
设置此任务类型的速率限制(限制在给定时间范围内可以运行的任务数量)。
可以通过在值后添加“ / s”,“ / m”或“ / h”来指定速率限制,以秒,分钟或小时为单位。 任务将在指定的时间段内平均分配。
示例:“ 100 / m”(每分钟一百个任务)。 这将在同一工作程序实例上启动两个任务之间强制执行至少600ms的延迟。
因此,如果您希望将其限制为每秒1个查询,请尝试以下操作:
@shared_task(rate_limit='1/s')
def query_api_multiple(values):
...
是的,如果您创建多个任务,那么它们可能会同时运行。
如果要限制每个时间段运行的任务数,可以使用芹菜对任务类型进行限制。 或者,如果您需要比芹菜提供的OOtB更多的灵活性,则可以使用redis之类的东西结合芹菜重试来实现限速模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.