- django 里配置celery
创建一个celery_config文件夹
有 init.py和celery.py
celery.py
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, platforms
from django.conf import settings
# http://docs.celeryproject.org/en/latest/userguide/daemonizing.html#running-the-worker-with-superuser-privileges-root
# for root start celery_config
platforms.C_FORCE_ROOT = True
# set the default Django settings module for the 'celery_config' program.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
app = Celery("proj")
# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery_config-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object("django.conf:settings")
# Load task modules from all registered Django app configs.
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print("Request: {!r}".format(self.request))
init.py
from .celery import app as celery_app
__all__ = ["celery_app"]
2.在settings.py里配置
import djcelery
INSTALLED_APPS = [
...,
'djcelery'
]
BROKER_URL = "redis://127.0.0.1:6379/0"
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
CELERY_ENABLE_UTC = False
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
CELERYD_CONCURRENCY = 2
CELERY_IMPORTS = (
'celerydemo.tasks',
)
3.创建一个tasks.py文件,里面写上要准备动态创建的定时任务
from celery import Task
from celery.schedules import crontab
from celery.task import task, periodic_task
from celery.app import shared_task
class BaseTask(Task):
def on_failure(self, exc, task_id, args, kwargs, einfo):
"""
任务执行失败回调
:param exc:
:param task_id:
:param args:
:param kwargs:
:param einfo:
:return:
"""
print('执行task失败')
print(task_id, einfo)
def on_success(self, retval, task_id, args, kwargs):
"""
任务执行成功回调
:param retval:
:param task_id:
:param args:
:param kwargs:
:return:
"""
print(f'执行task成功,task id为:{task_id}')
print(retval, args, kwargs)
@task(bind=True, base=BaseTask)
def add(self, a, b):
print(self.request.id)
print(a+b)
# @periodic_task(run_every=crontab(minute='*'), base=BaseTask)
# def print_time():
# print('你是傻逼吗')
# 动态创建定时任务
@shared_task()
def print_kwargs(*args, **kwargs):
print('字典参数')
print(args)
print(kwargs)
在views.py里创建定时任务
import json
from datetime import datetime, timedelta
from django.http import JsonResponse
from djcelery.models import PeriodicTask, PERIOD_CHOICES, IntervalSchedule, CrontabSchedule
from .tasks import add, test_task
def hello_views(request):
PeriodicTask.objects.filter(pk=3).update(enabled=False)
# 两种任务执行周期
# target_time = datetime.now() + timedelta(minutes=2)
# every = int((target_time - datetime.now()).total_seconds())
# period = PERIOD_CHOICES[3][0]
# interval = IntervalSchedule.objects.create(every=every, period=period)
crontab = CrontabSchedule.objects.create(minute='*')
# 创建定时任务
PeriodicTask.objects.create(name='测试任务3', # 名称必须唯一
task='celerydemo.tasks.print_kwargs',
# interval=interval,
crontab=crontab,
expires=datetime.now() + timedelta(hours=5),
args=json.dumps([1, 2]),
kwargs=json.dumps({'name': 'xiaoli', 'age': 20})
)
return JsonResponse({'data': lst, 'code': 200})
这样定时任务创建成功
注意:要先准备任务执行方法, 否则会报错