我有一个 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()
它工作正常,但是当我更改模型中的小时和分钟时,并没有反射(reflect)在我的任务中,也就是说,如果最初的小时是下午 1 点,分钟 = 30,那么任务将在 13:30 执行,但如果我更改时间到下午 1 点,到 40 分,此时任务不会执行。
最佳答案
问题是,当您更改小时和分钟值时,任务将不会重新注册。对于您的情况,使用 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 设置以包含以下内容 -
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 管理面板中,您现在应该有一个名为“定期任务”的注册模型。您可以添加实例定期任务,以使用定义的 crontab 运行新任务。
您需要使用类似这样的命令与您的工作人员一起运行 celerybeat(提供您的应用程序名称来代替“app”)-
celery -A app worker -B -l INFO
这可能有助于开始使用 celerybeat - https://www.merixstudio.com/blog/django-celery-beat/
关于python - 变量在周期性任务中不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56125681/