celerybeat如何通过调度程序将参数传递给函数?

7

我遇到了通过celerybeat调度传递函数参数的问题。在搜索后,似乎使用args命令可以传递它们,但是我得到了以下错误。有没有人能指导我正确的方向?

CELERYBEAT_SCHEDULE = {
    'maintenance_mail_1_day': {
        'task': 'home.tasks.maintenance_mail',
        'schedule': crontab(hour='15'),
        'args' : (1),
    },
    'maintenance_mail_3_day': {
        'task': 'home.tasks.maintenance_mail',
        'schedule': crontab(hour='15'),
        'args' : (3),
    },    
    'maintenance_mail_5_day': {
        'task': 'home.tasks.maintenance_mail',
        'schedule': crontab(hour='15'),
        'args' : (5),
    },
    'maintenance_mail_7_day': {
        'task': 'home.tasks.maintenance_mail',
        'schedule': crontab(hour='15'),
        'args' : (7),
    }

任务,py

@app.task
def maintenance_mail(days):
    return send_maintnance_emails(days)

你得到了哪些错误? - Laur Ivan
参数必须是元组:使用 'args': (1,)(注意多余的逗号) - user2390182
2个回答

11

以下内容适用于Python:(1) == 1

为了将其变成单元素的tuple,请添加一个额外的逗号:(1,)并相应调整您的设置:

# ...
'args' : (1,),
# ...

0
您可以按照以下方式指定用于执行任务的参数和关键字参数。请注意,需要使用JSON序列化。
import json

CELERYBEAT_SCHEDULE = {
    'maintenance_mail_1_day': {
        'task': 'home.tasks.maintenance_mail',
        'schedule': crontab(hour='15'),
        'args' : json.dumps([1]),
    }
}

或者

import json

CELERYBEAT_SCHEDULE = {
    'maintenance_mail_1_day': {
        'task': 'home.tasks.maintenance_mail',
        'schedule': crontab(hour='15'),
        'kwargs' : json.dumps({
            'days': 1,
        }),
    }
}

更多信息请参见:Django Celery Beat 文档


你链接的文档是关于django-celery-beat向表中添加行的内容。OP提到的配置要求'args'为元组或列表,'kwargs'为字典:https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html#available-fields - Tim Tisdall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接