使用 Django + Celery 的 PeriodicTask
PeriodicTask with Django + Celery
我正在尝试在我的项目中执行定期任务,但我无法让它工作。在我的开发中,我像这样执行芹菜:
python manage.py celery worker -l info
但是当我尝试时:
celery -B -l info
或
python manage.py celery -B -l info
我得到一个 Connection refused error
。
我还安装了 flower 来监控任务是否执行。我还有其他通过代码执行的任务,但现在我想执行定期任务。
我的任务(实际有效)继承自 celery.task.Task
,而我希望定期执行的任务来自 celery.task.PeriodicTask
,如下所示:
from celery.task import PeriodicTask
TaskToBePeriodical(PeriodicTask):
run_every = crontab() # This should make it execute every minute, just for test
def run(self, **kwargs):
# Do something awesome...
看起来你启动芹菜的命令不太正确。
根据您尝试安排的内容,您可能想尝试将其设置为 celery.beat。
可能值得注意的是,此方法不使用 django-celery,正如 Celery 文档提到的那样,"THIS PROJECT IS NO LONGER REQUIRED"
请参阅此处了解有关 celery.beat 的更多信息:
http://celery.readthedocs.org/en/latest/reference/celery.beat.html
Celery 启动命令
celery -A proj.celery_app worker -l info -B
项目目录
+-- proj
| +-- celery_app.py
| +-- settings.py
| +-- urls.py
| +-- ...
+-- app
| +-- models.py
| +-- tasks.py
| +-- urls.py
| +-- views.py
| +-- ...
celery_app.py
from __future__ import absolute_import
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
from django.conf import settings
app = Celery('proj')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
settings.py
CELERYBEAT_SCHEDULE = {
'name_of_task': {
'task': 'app.tasks.periodic_task',
'schedule': crontab()
}
}
tasks.py
from __future__ import absolute_import
from celery import shared_task
@shared_task
def periodic_task():
# Do your awesome thing
return
我正在尝试在我的项目中执行定期任务,但我无法让它工作。在我的开发中,我像这样执行芹菜:
python manage.py celery worker -l info
但是当我尝试时:
celery -B -l info
或
python manage.py celery -B -l info
我得到一个 Connection refused error
。
我还安装了 flower 来监控任务是否执行。我还有其他通过代码执行的任务,但现在我想执行定期任务。
我的任务(实际有效)继承自 celery.task.Task
,而我希望定期执行的任务来自 celery.task.PeriodicTask
,如下所示:
from celery.task import PeriodicTask
TaskToBePeriodical(PeriodicTask):
run_every = crontab() # This should make it execute every minute, just for test
def run(self, **kwargs):
# Do something awesome...
看起来你启动芹菜的命令不太正确。
根据您尝试安排的内容,您可能想尝试将其设置为 celery.beat。
可能值得注意的是,此方法不使用 django-celery,正如 Celery 文档提到的那样,"THIS PROJECT IS NO LONGER REQUIRED"
请参阅此处了解有关 celery.beat 的更多信息: http://celery.readthedocs.org/en/latest/reference/celery.beat.html
Celery 启动命令
celery -A proj.celery_app worker -l info -B
项目目录
+-- proj
| +-- celery_app.py
| +-- settings.py
| +-- urls.py
| +-- ...
+-- app
| +-- models.py
| +-- tasks.py
| +-- urls.py
| +-- views.py
| +-- ...
celery_app.py
from __future__ import absolute_import
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
from django.conf import settings
app = Celery('proj')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
settings.py
CELERYBEAT_SCHEDULE = {
'name_of_task': {
'task': 'app.tasks.periodic_task',
'schedule': crontab()
}
}
tasks.py
from __future__ import absolute_import
from celery import shared_task
@shared_task
def periodic_task():
# Do your awesome thing
return