0

我正在尝试使用 celery 执行定期任务,以删除未及时激活帐户的用户。下面的屏幕截图显示该任务已正确发现并执行,但是当我检查数据库时,没有进行任何更改。

芹菜任务:

#tasks.py
from celery.task.schedules import crontab
from celery.decorators import periodic_task
from celery.utils.log import get_task_logger
from .utils import unconfirmed_users_delete

logger = get_task_logger(__name__)

# A periodic task that will run every minute (the symbol "*" means every)
@periodic_task(run_every=(crontab(hour="*", minute="*", day_of_week="*")))
def delete_unconfirmed_users():
    return unconfirmed_users_delete()

要执行的查询集(在 django shell 中检查并正常工作):

#utils.py
from django.contrib.auth.models import User
from django.utils import timezone

def unconfirmed_users_delete():
    return User.objects.filter(is_active=False).filter(profile__key_expires__lt=timezone.now()).delete()

该任务每分钟正确调用一次:

在此处输入图像描述

有什么问题?

4

1 回答 1

1

正如@schillingt 大多数时候提到的那样,我们忘记(重新)启动周期性任务的工作进程。

发生这种情况是因为我们有一个节拍调度程序来调度任务和执行任务的工作人员。

celery -A my_task beat  # schedule tasks
celery worker -A my_task -l info  # consume tasks

一个更好的解决方案是让一个工作人员安排任务并执行。您可以使用

celery worker -A my_task -l info --beat  # schedule & consume tasks

这会安排周期性任务并使用它。

于 2015-05-06T17:09:58.810 回答