我有一个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点,那么该任务就不会在那时执行。
答案 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/