【问题标题】:send email periodically from a specific time django celery从特定时间定期发送电子邮件 django celery
【发布时间】:2019-01-08 18:30:52
【问题描述】:

我的 django 模型中的活动列表。我需要每 15 分钟向用户发送一次电子邮件,直到活动(如果活动状态:高)完成。

我遵循的步骤:

1.created celery 任务

2.triggered this task using apply_async(eta='time object')

3.我在CELERYBEAT_SCHEDULE中注册了这个任务

#1.celery task
@shared_task
def periodic_send_email(self, *args, **kwargs):
   #Logic for sending email

#2.task triggering
periodic_send_email.apply_async(eta= "I used time object", retry= True)

#3.registering the task in settings:
CELERYBEAT_SCHEDULE = {
'periodic_send_email': {
    'task': 'cloud_app.tasks.periodic_send_email',
    'schedule': crontab(),
},
}

【问题讨论】:

    标签: django-celery


    【解决方案1】:

    用于启动调度器; http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#starting-the-scheduler

    Crontab 调度程序; http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#crontab-schedules

    您不需要任务触发器。您应该将 crontab 设置为 crontab(minute="*/15")

    from celery.schedules import crontab
    CELERYBEAT_SCHEDULE = {
    'periodic_send_email': {
        'task': 'cloud_app.tasks.periodic_send_email',
        'schedule': crontab(minute="*/15"),
    },
    }
    

    而且,您必须使用-B 参数启动芹菜。 首先,用命令启动celery worker;

    celery -A proj worker -B
    

    之后,开始芹菜节拍;

    celery -A proj beat
    

    【讨论】:

    • 感谢您的回复。这不是 crontab() 的问题,我只是在测试它。
    • 感谢您的回复。我的任务是:假设必须在特定时间开始一项活动。开始活动的人会将活动状态从“打开”更改为“进行中”。我必须检查活动状态,如果当时状态仍未开始,那么我必须每 15 或 20 分钟定期发送邮件。我试图在使用 apply_async(args, kwargs ,eta) 的信号中触发任务(当创建或更新活动时)。我正在向上面提到的任务发送 kwargs 中的实例。在第二个节拍任务中,从 CELERYBEAT_SCHEDULE 获取 args、kwargs。请帮忙..
    【解决方案2】:

    我有一个。 我们可以使用数据库支持的定期任务。
    包:django-celery-beat

    https://django-celery-beat.readthedocs.io/en/latest/

    在管理面板中,我们可以创建具有特定间隔的周期性任务,我们也可以存储 args、kwargs。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 2015-04-29
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      相关资源
      最近更新 更多