Celery group中如何为单个任务设置独立countdown参数避免报错?
报错原因
你将调度参数
countdown错误传入了任务签名的参数列表:some_task.s()方法接收的所有参数都会被直接传递给任务本身的run方法作为执行参数,而你的some_task没有定义countdown参数,因此触发参数不匹配的报错。
调度相关的配置(包括countdown、eta、执行队列、重试策略等)属于签名的执行选项,不属于任务业务参数,需要单独设置。
正确实现方案
直接在生成的任务签名后调用.set()方法追加countdown配置即可,该方法的参数会被识别为调度配置,不会传递给任务的run方法。
如果需要将任务分散在1小时内执行,直接给每个任务生成0~3600的随机整数作为countdown值即可,完整代码如下:
import random from celery import group the_group_of_tasks = group( # 业务参数传入s(),调度参数传入set() some_task.s(an_object.the_data_dict).set(countdown=random.randint(0, 3600)) for an_object in AnObject.objects.all() ) the_group_of_tasks.delay()
其他可选写法
你参考文档中的signature方法也可以实现相同效果,写法如下:
import random from celery import group, signature the_group_of_tasks = group( signature( some_task, args=(an_object.the_data_dict,), countdown=random.randint(0, 3600) ) for an_object in AnObject.objects.all() ) the_group_of_tasks.delay()
内容的提问来源于stack exchange,提问作者camelBack
相关产品推荐
相关产品推荐

