flyEn'blog

django_celery定时任务配置及运行

例如项目名为porject

项目下(与配置文件同层):

project/__init__.py

1
from .celery import app as celery_app

创建project/celery.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import unicode_literals

import os

from celery import Celery
from django.conf import settings

# set the default Django settings module for the 'celery' program.

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
app = Celery('project')

# 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)

修改配置文件project/settings/base.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

INSTALLED_APP += [
'kombu.transport.django',
'djcelery'
]

import djcelery
djcelery.setup_loader()

BROKER_URL = 'django://'

CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 定时任务
CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend'

CELERY_ACCEPT_CONTENT = ['application/json']

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Shanghai'

app下demo/tasks.py:

1
2
3
4
5
6
7
from __future__ import absolute_import
from celery import shared_task


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

启动worker

1
2
# 这里我指定了配置,默认的话忽略info后面
python manage.py celery worker --loglevel=info --settings=proj.prod_settings

(测试)直接执行任务:
进入项目内shell环境下:

1
2
from demoapp.tasks import add
add.delay(4, 4)

上面的worker log中出现return值为16就说明celery配置完成。

django-celery的定时任务功能

celery beat定时或者定间隔给celery发送task

配置即:

1
2
# proj/settings.py
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

需要迁移:

1
python manage.py migrate

可以后台配置任务执行间隔(或者定时器直接指定)

1
python manage.py celery beat

时间间隔

  1. 设置秒数
1
@periodic_task(run_every=10)
  1. 通过datetime设置时间间隔
1
@periodic_task(run_every=datetime.timedelta(hours=1, minutes=15, seconds=40))
  1. celery的crontal表达式
1
@periodic_task(run_every=crontab())

表示每分钟0秒时刻执行一次

七个参数:(常用的五个)

(1). minute: 分,范围0~59

(2).hour: 小时,范围0~23

(3).day_of_week:星期,范围0~23

(4).day_of_month: 每个月几号,范围1~31

(5).month_of_year:月份,范围1~12

默认

1
crontab(minute='*', hour='*', day_of_week='*', day_of_month='*', month_of_year='*')

每天每小时每分钟执行一次(每分钟执行一次任务)。

具体某个值

1
crontab(minute=15)

每小时的15分时刻执行一次任务

1
crontab(minute=0, hour=0)

每天0点0分时刻执行一次任务

设置范围

1
crontab(minute='*', hour='9-12')

每天指定9点到12点每个小时的每分钟执行任务(*号是默认值,可以省略)。

1
crontab(hour='9-12,20')

逗号是or逻辑关系,指定(1点到12点)和(20点)中每分钟执行任务

celery提供了一个类得到表达式解析结果:

1
2
3
from celery.task.schedules import crontab_parser
r = crontab_parser(23, 0).parse('9-12,20')
print(r)

>

1
set([9, 10, 11, 12, 20])

设置间隔步长

1
crontab(day_of_month='1,3,5,7,9,11')

设置1、3、5、7、9、11月份每天每分钟执行任务

1
2
crontab(minute='*/2')
crontab(minute='0-59/2')

这个/号是步长,每隔2分钟执行一次,相当于range的第三个参数range(0, 59+1, 2)

Fork me on GitHub