Django Celery · Harryx

celery是一个任务队列,主要用于任务调度和定时任务。

Django Celery

以前版本的Celery需要一个单独的库(django-celery)来和Djnago协同工作,新版本的Celery可以直接在Django项目中使用。

一些准备工作

安装celery

1
pip install celery

dj_demo/dj_demo/celery.py文件中创建celery实例。

1
2
3
4
5
6
7
8
9
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dj_demo.settings')

app = Celery('dj_demo')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

proj/proj/__init__.py中导入。

1
2
3
4
5
from __future__ import absolute_import, unicode_literals

from .celery import app as celery_app

__all__ = ('celery_app',)

setting.py指定一些参数,更多参数

1
2
3
4
5
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
CELERY_TIMEZONE = 'Asia/Shanghai'

这里使用redis作为broker,所以需要安装redis依赖

1
pip install redis

创建一些任务

Celery会自动从app的tasks.py中寻找任务,只需要在app/tasks.py中用shared_task装饰器标记任务即可。

1
2
3
4
5
6
from celery import shared_task


@shared_task
def add(x, y):
return x + y

一些定时任务

如果希望一些任务定时执行,可以在settings.py文件指定。

1
2
3
4
5
6
7
CELERY_BEAT_SCHEDULE = {
'test': {
'task': 'demo.tasks.add',
'schedule': 5,
'args': (1, 2)
}
}

Django Celery beat

django-celery-beat扩展可以使用数据库管理定时任务。

安装依赖

1
pip install django_celery_beat

配置INSTALLED_APPS

1
2
3
4
INSTALLED_APPS = [
# ...
'django_celery_beat',
]

数据库迁移

1
python manage.py migrate

配置DatabaseScheduler

1
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'

动态创建定时任务

创建定时任务需要给出scheduletask

schedule可以是SolarSchedule(日出、日落等太阳相关时间)、ClockedSchedule(一个精确的日期)、IntervalSchedule(固定间隔时间)、CrontabSchedule(crontab定时)。

task是在app中定义的任务。

例如创建一个每天12:00执行的定时任务。

1
2
3
4
5
6
7
8
9
10
11
schedule, created = CrontabSchedule.objects.get_or_create(
minute='0',
hour='12',
timezone='Asia/Shanghai'
)
PeriodicTask.objects.create(
crontab=schedule,
name='add',
task='kanna.tasks.start_job',
args='[1, 2]'
)

启动

启动beat服务

1
celery -A dj_demo beat -l info

启动worker进程
windows:

1
celery -A djgraph worker --pool=solo -l info

linux:

1
celery -A djgraph worker -l info