Django的事情变化太大,所以我不能使用3.1。我需要一些帮助。
我阅读了make a task in django,并阅读了Periodic Tasks文档。但我不知道如何在django中定期执行任务。我想这是因为我的低级英语..
在旧版本的Celery中,我导入了 djcelery & crontab 并在 settings.py 中设置了CELERYBEAT_SCHEDULE,并由执行> manage.py
但似乎我再也不能以这种方式执行芹菜deamon了。比我应该把CELERYBEAT_SCHEDULE放在哪里?在docs中的django示例中,他们设置了os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
在 proj / proj / celery.py 中。 (1)所以在 settings.py 中设置celerybeat(就像之前一样)可以吗?
(2)如果可以的话,在django中定期任务的一个小例子将非常有用。当我阅读教程时,最令人困惑的部分是文件路径。如果你不想提供一个完整的例子,如果你解释我应该在哪里制作任务,设定节拍和执行守护,我将非常感激。
感谢阅读。
答案 0 :(得分:60)
我假设您已经阅读了文档中的django section,但是您看到了example project吗?
它不使用调度程序,但如果将其添加到settings.py
:
from __future__ import absolute_import
from celery.schedules import crontab
CELERYBEAT_SCHEDULE = {
# crontab(hour=0, minute=0, day_of_week='saturday')
'schedule-name': { # example: 'file-backup'
'task': 'some_django_app.tasks....', # example: 'files.tasks.cleanup'
'schedule': crontab(...)
},
}
# if you want to place the schedule file relative to your project or something:
CELERYBEAT_SCHEDULE_FILENAME = "some/path/and/filename"
现在对于命令,忘记manage.py
,只需直接输入celery
:
-B
让芹菜一如既往地打败。
-A
指定芹菜应用的名称。请注意示例项目的celery.py中的这一行:app = Celery('proj')
celery -A proj worker -B -l info
INSTALLED_APPS += ('djcelery',)
# store schedule in the DB:
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
答案 1 :(得分:23)
您可以使用django-celery应用程序:https://pypi.python.org/pypi/django-celery
<强>安装强>:
pip install django-celery
要为您的项目启用django-celery,您需要将djcelery添加到INSTALLED_APPS:
INSTALLED_APPS += ("djcelery", )
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
然后将以下行添加到settings.py:
import djcelery
djcelery.setup_loader()
<强> USAGE 强>
在linux上,你可以像这样运行celery-beat工作者:
python manage.py celeryd worker --loglevel=DEBUG -E -B -c 1
python manage.py help celeryd #to find out the args meaning
此外,您还想在django admin中监控任务。要启用监控功能,您需要运行celerycam:
python /var/www/gorod/manage.py celerycam
要定期执行任务,您可以使用celery.decorators.periodic_task。
# myapp/tasks.py
import datetime
import celery
@celery.decorators.periodic_task(run_every=datetime.timedelta(minutes=5))
def myfunc():
print 'periodic_task'
或使用
# settings.py
CELERYBEAT_SCHEDULE = {
'add-every-30-seconds': {
'task': 'tasks.add',
'schedule': timedelta(seconds=30),
'args': (16, 16)
},
}