变量在周期性任务中不更新

Variables not updating in periodic tasks

我有一个 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()

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

问题是,当您更改小时和分钟值时,任务不会得到 re-registered。对于您的情况,使用 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 管理面板中,您现在应该有一个名为 'Periodic Tasks' 的注册模型。您可以使用已定义的 crontab 添加实例 Periodic Tasks 到 运行 您的 newtask

你需要用这样的命令 运行 与你的工人一起打芹菜(提供你的应用程序名称代替 'app')-

celery -A app worker -B -l INFO

这可能有助于开始使用 celery beat - https://www.merixstudio.com/blog/django-celery-beat/