tips:安装配置过程中如果遇到问题可到这里查看和解决:
https://blog.csdn.net/cn_1937/article/details/91992075
安装
pip install django-celery
构建建项目Django项目
django-admin startproject celery_demo
先运行一下django项目
python manage.py runserver
创建app
python manage.py startapp mytask
在新创建的app下创建task.py文件夹
from celery.task import Task
import time
from celery import platforms
platforms.C_FORCE_ROOT = True #root用户启动需要加上这一行
class mytask1(Task):
# 为任务起名字
name = 'task1'
def run(self,*args,**kwargs):
print('start mytask1 task')
time.sleep(4)
print ('args={},kwargs={}'.format(args,kwargs))
print('end mytask1 task')
在
celery_demo app下创建celeryconfig.py文件
import djcelery
djcelery.setup_loader()
# 设置任务队列
CELERY_QUEUES = {
'beat_tasks':{
'exchange':'beat_tasks',
'exchange_type':'direct',
'binging_key':'beat_tasks'
},
'work_queue':{
'exchange':'work_queue',
'exchange_type':'direct',
'binging_key':'work_queue'
}
}
# 默认使用的队列
CELERY_DEFAULT_QUEUE = 'work_queue'
CELERY_IMPORTS = (
'mytask.task',
)
# 有些情况可以防止死锁
CELERYD_FORCE_EXECV = True
# 设置并发worker数量
CELERYD_CONCURRENCY = 4
# 失败后允许重试
CELERY_ACKS_LATE = True
# 每个worker最多可以执行100个任务被销毁,可以防止内存泄漏
CELERYD_MAX_TASKS_PER_CHILD = 100
# 单个任务的最大运行时间
CELERYD_TASK_TIME_LIMIT = 12 * 30
在settings.py中配置
Celery相关配置
from .celeryconfig import *
BROKER_BACKEND = 'redis'
BROKER_URL = 'redis://127.0.0.1:6379/1'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/2'
INSTALLED_APPS中添加
'djcelery',
'mytask',
在mytaks app的views中添加视图
from django.http import JsonResponse
# Create your views here.
from . import task
def task_run(request):
# 执行异步任务
task.mytask1.delay()
return JsonResponse({'result':'ok'})
配置urls;
path('task/',task_run,name='task_run'),
启动运行任务:
python manage.py runserver
# 启动celery
python manage.py celery worker -l INFO
在浏览器输入 http://127.0.0.1:8000/task/
执行异步任务测试成功
创建定时任务
from celery.task import Task
import time
from celery import platforms
platforms.C_FORCE_ROOT = True #root用户启动需要加上这一行
class mytask1(Task):
```
异步任务
```
# 异步任务队列
name = 'task1'
def run(self,*args,**kwargs):
print('start mytask1 task--------------------------------1')
time.sleep(4)
print ('args={},kwargs={}'.format(args,kwargs))
print('end mytask1 task----------------------------------1')
class mytask2(Task):
```
定时任务
```
# 为任务起名字
name = 'task2'
def run(self,*args,**kwargs):
print('start mytask2 task----------------------------------2')
time.sleep(4)
print ('args={},kwargs={}'.format(args,kwargs))
print('end mytask2 task-----------------------------------2')
在celeryconfig中增加定时任务配置
# 定义一个定时任务
CELERYBEAT_SCHEDULE = {
'task1':{
'task':'task2',
'schedule':timedelta(seconds=5), # 设置任务每5秒执行一次
'options':{
'queue':'beat_tasks' # 指定一个任务队列
}
}
}
在终端中启动:
python manage.py celery beat -l INFO # 启动beat 测试定时任务
python manage.py celery worker -l INFO # 启动worker
python manage.py runserver # 启动服务器 测试异步任务
在浏览器请求了异步任务接口:
定时任务启动,每5秒调度器发送一个定时任务
任务执行结果,定时任务。异步任务都的都执行