变量在定期任务中不更新

时间:2019-05-14 08:05:03

标签: python celery

我有一个django模型,可以存储分钟和小时

#models.py
HOUR_CHOICES=(
        ('12', '12PM'),
        ('13', '1PM'),
        ('14', '2PM'),
        ('15', '3PM'),
        ('16','4PM'),
        ('17','5PM'),
        ('18','6PM')
                )
class time(models.Model):
        hour = models.CharField(max_length=2,choices=HOUR_CHOICES)
        minute=models.CharField(max_length=100)
        status=models.CharField(max_length=10,choices=STATUS)

#tasks.py
Value=time.objects.all()
for obj in Value:
                minute=obj.minute
                hour=obj.hour

@periodic_task(run_every=crontab(minute=minute, hour=hour), name="newtask")
def newtask():
        f = open("test.txt", "a")
        f.write("test\n")
        f.close()

它工作正常,但是当我更改模型中的小时和分钟时并没有反映在我的任务中,即如果最初的小时是1PM,而分钟= 30,则任务将在13:30执行,但是如果我更改时间到下午1点,分钟到40点,那么该任务就不会在那时执行。

1 个答案:

答案 0 :(得分:1)

问题在于,当您更改小时和分钟值时,该任务将不会重新注册。对于您的情况,使用 django-celery-beat https://github.com/celery/django-celery-beat)似乎很理想。使用以下命令进行安装-

pip install django-celery-beat

然后将其包含在已安装的应用中-

INSTALLED_APPS = [
    ...
    'django_celery_beat',
]

迁移-

python manage.py migrate

更新您的芹菜设置以包括以下内容-

CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler"

现在假设您的任务定义为-

#tasks.py
from celery import shared_task

@shared_task
def newtask():
        f = open("test.txt", "a")
        f.write("test\n")
        f.close()

在Django管理控制台中,您现在应该拥有一个名为“定期任务” 的注册模型。您可以添加实例定期任务,以使用已定义的crontabs运行 newtask

您需要使用以下命令与工作人员一起运行芹菜节拍(提供应用名称代替“ app”)-

celery -A app worker -B -l INFO

这对于开始使用芹菜拍子很有帮助-https://www.merixstudio.com/blog/django-celery-beat/