django使用celery搭配redis配置定时任务
已经安装环境:
Python3.6
django==2.1.8(用2.2.2需要升级sqlite3)
项目名称:ceshiproject APP名称:ceshi
第一步:centos7下首先安装redis程序
wget http://download.redis.io/releases/redis-5.0.5.tar.gz 或者 到官网https://redis.io/download 查看教程并下载
tar xzf redis-5.0.5.tar.gz
yum install gcc gcc-c++ #安装一下依赖,如果有省略
cd redis-5.0.5
make MALLOC=libc
cd src && make install
---------到此安装完成---------------
cd redis-5.0.5 #进入安装目录
./redis-server #启动redis
./redis-cli #可进入redis命令模式,一般用不上
第二步:安装django-celery==3.2.2,并在APP中添加加 'djcelery' (注意:如果超过3.2.2版本程序会报错:TypeError: can only concatenate list (not "tuple") to list)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'ceshi',
'djcelery'
]
第三步:在项目ceshiproject下,新建配置文件celeryconfig.py,内容如下
# -*- coding:utf-8 -*-
import djcelery
djcelery.setup_loader()
from datetime import timedelta #设置任务运行时,使用的队列,以防造成定时,跟定期拥堵
CELERY_QUEUES = {
'beat_task1':{
'exchange':'beat_task1',
'exchange_type':'direct',
'binding_key':'beat_task1'
},
'work_queue':{
'exchange':'work_queue',
'exchange_type':'direct',
'binding_key':'work_queue'
}
} #设置默认使用的队列
CELERY_DEFAULT_QUEUE = 'work_queue' #导入任务
CELERY_IMPORTS=(
'ceshi.task1',
) #有些情况下防止死锁
CELERY_FORCE_EXECV = True #设置并发的worker数量,根据cpu核心数量来定
CELERY_CONCURRENCY = 4 #任务失败,可以允许重试
CELERY_ACKS_LATE = True #设置每一个worker可以执行多少个任务后销毁,防止内存泄漏
CELERY_MAX_TASKS_PER_CHILD = 100 #单个任务最大的运行时间,这边设置6分钟
CELERY_TASK_TIME_LIMIT = 12 * 30 # 定时任务
CELERYBEAT_SCHEDULE = {
'task1': {
'task': 'ceshi_task', # 任务名称
'schedule': timedelta(seconds=10), # 时间周期
'options': {
'queue': 'beat_task1' # 消息队列
}
},
# 'task2': {
# 'task': 'update-db', # 任务名称
# # 'schedule': crontab(minute=0, hour=0), # 每天凌晨执行一次
# 'schedule': timedelta(seconds=10), #
# 'options': {
# 'queue': 'beat_tasks'
# }
# }
}
第四步:在APP下面新建任务task1.py,内容如下:
from celery.task import Task #调用celery中的task模块
import time
class ceshitask(Task):
name = "ceshi_task"
def run(self, *args, **kwargs):
print ("start ceshi task")
time.sleep(5)
print ("args={},kwargs={}".format(args,kwargs))
print ("end task")
第五步:配置好项目跟APP的路由
项目ceshiproject路由:
from django.contrib import admin
from django.urls import path,include urlpatterns = [
path('admin/', admin.site.urls),
path('', include('ceshi.urls',namespace='ceshi')),
]
APP(ceshi)的路由
from django.urls import path
from . import views
app_name="ceshi"
urlpatterns = [
path('do/', views.do,name='do'),
]
第六步:
首先安装redis驱动:pip install redis==2.10.6
redis==2.10.6 (高版本会报错,用于django内部驱动用跟下面安装程序是不一样)
在setting.py中配置redis调用,引入项目下面的celerycofig.py
from .celeryconfig import *
BROKER_BACKEND = 'redis'
BROKER_URL = 'redis://localhost:6379/1'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'
第七步:在views.py中引入APP下面的task1,并调用
from django.http import JsonResponse
from ceshi.task1 import ceshitask def do(request):
#执行异步任务
print ('start request')
ceshitask.delay()
print ('end request')
return JsonResponse({"result":"ok"})
第八步:开启两个终端,并在终端中(Terminal)启动celery中的worker跟定时任务beat模块,进行测试
python manage.py celery worker -l INFO #首先开启worker
python manage.py celerybeat -l INFO #开启定时任务
第九步:上面可以使用了,如果要在django中调用,进行一序列的操作,请继续往下走:
1.把django中cache用于redis
首先安装django-redis==4.10
2.把下面的内容添加到django的settings.py中(redis默认不能超过16,如果
redis://127.0.0.1:6379/10 设置为17会出现:redis.exceptions.ResponseError: DB index is out of range
)
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
# 把这里缓存你的redis服务器ip和port
"LOCATION": "redis://127.0.0.1:6379/10",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# 3.设置redis存储django的session信息
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
3.可以在task任务,通过下面命令设置redis,(注意:设置cache时候参数加None,即cache永久不失效)
from django.core.cache import cache
class ceshitask(Task):
name = "ceshi_task"
def run(self, *args, **kwargs):
cache.set("start-ceshi-task",值, None)
return "ceshi....."
4.在views中调用
from django.shortcuts import render,HttpResponse
from django.core.cache import cache
import json def num_recode(request):
count = cache.get("start-ceshi-task")
print(json.loads(count))
return HttpResponse(count)
django使用celery搭配redis配置定时任务的更多相关文章
- Django + Celery 实现动态配置定时任务
哈喽,今天给大家分享一篇Django+Celery实现动态配置定时任务,因为最近也是无意间看到一位大佬关于这块的文章,然后自己觉得不错,也想学习写一下,然后最终实现功能是在前端页面统一管理计划任务,大 ...
- Django 使用celery任务队列的配置
celery 情景:用户发起request,并等待response返回.在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件.手机验证码等. 使用 ...
- 基于Django+celery二次开发动态配置定时任务 ( 一 )
需求: 前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统.监控,于是乎开发.测试.产品.运营.业务部.财务等等各个部门就跟那饥渴的饿狼一样需要 各种各样的系统数据满足他们.刚开始一天一个还 ...
- 基于Django+celery二次开发动态配置定时任务 ( 二)
一.需求 结合上一篇,使用djcelery模块开发定时任务时,定时任务的参数都保存在djcelery_periodictask表的args.kwargs字段里,并且是json格式.那么,当定时任务多了 ...
- django —— Celery实现异步和定时任务
1. 环境 python==2.7 djang==1.11.2 # 1.8, 1.9, 1.10应该都没问题 celery-with-redis==3.0 # 需要用到redis作为中间人服务(Bro ...
- Celery+python+redis异步执行定时任务
我之前的一篇文章中写了[Celery+django+redis异步执行任务] 博文:http://blog.csdn.net/apple9005/article/details/54236212 你会 ...
- celery 动态配置定时任务
How to dynamically add or remove tasks to celerybeat? · Issue #3493 · celery/celery https://github.c ...
- Django Redis配置
Django Redis配置 # Django默认不支持redis,需要第三方插件来支持 pipenv install django-redis pipenv install hiredis # 不是 ...
- Django中Celery的实现介绍(一)
Django中Celery的实现 Celery官网http://www.celeryproject.org/ 学习资料:http://docs.jinkan.org/docs/celery/ Cele ...
随机推荐
- SpringBoot 整合 SpringSecurity 梳理
文档 Spring Security Reference SpringBoot+SpringSecurity+jwt整合及初体验 JSON Web Token 入门教程 - 阮一峰 JWT 官网 Sp ...
- Xilinx约束学习笔记(一)—— 约束方法学
<Xilinx约束学习笔记>为自己阅读 Xilinx 官方 UG903 文档后的学习笔记,大多数为翻译得来,方便大家学习. 1 约束方法学 1.1 组织约束文件 Xilinx 建议将时序约 ...
- Docker搭建网页数据库管理-Adminer
为什么Adminer比phpMyAdmin更好? 官网介绍: 用Adminer替换phpMyAdmin,您将获得一个简洁的用户界面,对MySQL功能的更好支持,更高的性能和更高的安全性.请参阅详细比较 ...
- 数据结构与算法——链表 Linked List(单链表、双向链表、单向环形链表-Josephu 问题)
链表是有序的列表,但是在内存中存储图下图所示 链表是以 节点 的方式来存储,是 链式存储 每个节点包含 data 域.next 域,指向下一个节点 链表的各个节点 不一定是连续存储,如上图所示 链表还 ...
- SpringBoot获取所有接口的路由
@Autowired WebApplicationContext applicationContext; @RequestMapping(value = "v1/getAllUrl" ...
- IO流(File类--递归--过滤器--IO字节流--IO字符流--Properties集合--缓冲流--转换流--序列化流--打印流)
一.File类 1.1概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 1.1.1相对路径与绝对路径 相对路径从盘符开始的路径,这是一个完整 ...
- 微信小程序学习笔记一 小程序介绍 & 前置知识
微信小程序学习笔记一 1. 什么是小程序? 2017年度百度百科十大热词之一 微信小程序, 简称小程序, 英文名 Mini Program, 是一种不需要下载安装即可使用的应用 ( 张小龙对其的定义是 ...
- Mysql 日期格式化 复杂日期区间查询
前言 最近在做项目涉及到Mysql的复杂日期查询,日期查询其实在数据库中查询其实还是用的挺多的,比如查询开始日期到结束日期的区间信息,查询日期小于有效日期的信息,查询当天的日期,明天的日期,做比较等. ...
- Go-内置函数之append、recover用法
package main import "fmt" import "time" func test() { defer func() { if err := r ...
- Shell中常用的语句
exit 完全中断脚本的执行 break 中断脚本的循环,但是会执行循环外的语句 continue 跳出本次循环,进行下一次循环 进一步了解三者的区别,有如下实验: 执行该脚本: 脚本正常运行情况: ...