已经安装环境:

Python3.6

django==2.1.8(用2.2.2需要升级sqlite3)

项目名称:ceshiproject   APP名称:ceshi

第一步:centos7下首先安装redis程序

  1. wget http://download.redis.io/releases/redis-5.0.5.tar.gz 或者 到官网https://redis.io/download 查看教程并下载
  2. tar xzf redis-5.0.5.tar.gz
  3. yum install gcc gcc-c++ #安装一下依赖,如果有省略
  4. cd redis-5.0.5
  5. make MALLOC=libc
  6. cd src && make install
  7. ---------到此安装完成---------------
  8. cd redis-5.0.5 #进入安装目录
  9. ./redis-server #启动redis
  10. ./redis-cli #可进入redis命令模式,一般用不上

第二步:安装django-celery==3.2.2,并在APP中添加加 'djcelery' (注意:如果超过3.2.2版本程序会报错:TypeError: can only concatenate list (not "tuple") to list)

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'ceshi',
  9. 'djcelery'
  10. ]

第三步:在项目ceshiproject下,新建配置文件celeryconfig.py,内容如下

  1. # -*- coding:utf-8 -*-
  2. import djcelery
  3. djcelery.setup_loader()
  4. from datetime import timedelta
  5.  
  6. #设置任务运行时,使用的队列,以防造成定时,跟定期拥堵
  7. CELERY_QUEUES = {
  8. 'beat_task1':{
  9. 'exchange':'beat_task1',
  10. 'exchange_type':'direct',
  11. 'binding_key':'beat_task1'
  12. },
  13. 'work_queue':{
  14. 'exchange':'work_queue',
  15. 'exchange_type':'direct',
  16. 'binding_key':'work_queue'
  17. }
  18. }
  19.  
  20. #设置默认使用的队列
  21. CELERY_DEFAULT_QUEUE = 'work_queue'
  22.  
  23. #导入任务
  24. CELERY_IMPORTS=(
  25. 'ceshi.task1',
  26. )
  27.  
  28. #有些情况下防止死锁
  29. CELERY_FORCE_EXECV = True
  30.  
  31. #设置并发的worker数量,根据cpu核心数量来定
  32. CELERY_CONCURRENCY = 4
  33.  
  34. #任务失败,可以允许重试
  35. CELERY_ACKS_LATE = True
  36.  
  37. #设置每一个worker可以执行多少个任务后销毁,防止内存泄漏
  38. CELERY_MAX_TASKS_PER_CHILD = 100
  39.  
  40. #单个任务最大的运行时间,这边设置6分钟
  41. CELERY_TASK_TIME_LIMIT = 12 * 30
  42.  
  43. # 定时任务
  44. CELERYBEAT_SCHEDULE = {
  45. 'task1': {
  46. 'task': 'ceshi_task', # 任务名称
  47. 'schedule': timedelta(seconds=10), # 时间周期
  48. 'options': {
  49. 'queue': 'beat_task1' # 消息队列
  50. }
  51. },
  52. # 'task2': {
  53. # 'task': 'update-db', # 任务名称
  54. # # 'schedule': crontab(minute=0, hour=0), # 每天凌晨执行一次
  55. # 'schedule': timedelta(seconds=10), #
  56. # 'options': {
  57. # 'queue': 'beat_tasks'
  58. # }
  59. # }
  60. }

第四步:在APP下面新建任务task1.py,内容如下:

  1. from celery.task import Task #调用celery中的task模块
  2. import time
  3. class ceshitask(Task):
  4. name = "ceshi_task"
  5. def run(self, *args, **kwargs):
  6. print ("start ceshi task")
  7. time.sleep(5)
  8. print ("args={},kwargs={}".format(args,kwargs))
  9. print ("end task")

第五步:配置好项目跟APP的路由

项目ceshiproject路由:

  1. from django.contrib import admin
  2. from django.urls import path,include
  3.  
  4. urlpatterns = [
  5. path('admin/', admin.site.urls),
  6. path('', include('ceshi.urls',namespace='ceshi')),
  7. ]

APP(ceshi)的路由

  1. from django.urls import path
  2. from . import views
  3. app_name="ceshi"
  4. urlpatterns = [
  5. path('do/', views.do,name='do'),
  6. ]

第六步:

首先安装redis驱动:pip install redis==2.10.6

redis==2.10.6 (高版本会报错,用于django内部驱动用跟下面安装程序是不一样)

在setting.py中配置redis调用,引入项目下面的celerycofig.py

  1. from .celeryconfig import *
  2. BROKER_BACKEND = 'redis'
  3. BROKER_URL = 'redis://localhost:6379/1'
  4. CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'

第七步:在views.py中引入APP下面的task1,并调用

  1. from django.http import JsonResponse
  2. from ceshi.task1 import ceshitask
  3.  
  4. def do(request):
  5. #执行异步任务
  6. print ('start request')
  7. ceshitask.delay()
  8. print ('end request')
  9. return JsonResponse({"result":"ok"})

第八步:开启两个终端,并在终端中(Terminal)启动celery中的worker跟定时任务beat模块,进行测试

  1. python manage.py celery worker -l INFO #首先开启worker
  2. python manage.py celerybeat -l INFO #开启定时任务

第九步:上面可以使用了,如果要在django中调用,进行一序列的操作,请继续往下走:

1.把django中cache用于redis

首先安装django-redis==4.10

2.把下面的内容添加到django的settings.py中(redis默认不能超过16,如果

  1. redis://127.0.0.1:6379/10 设置为17会出现:redis.exceptions.ResponseError: DB index is out of range

  1. CACHES = {
  2. "default": {
  3. "BACKEND": "django_redis.cache.RedisCache",
  4. # 把这里缓存你的redis服务器ip和port
  5. "LOCATION": "redis://127.0.0.1:6379/10",
  6. "OPTIONS": {
  7. "CLIENT_CLASS": "django_redis.client.DefaultClient",
  8. }
  9. }
  10. }
  11.  
  12. # 3.设置redis存储django的session信息
  13. SESSION_ENGINE = "django.contrib.sessions.backends.cache"
  14. SESSION_CACHE_ALIAS = "default"

3.可以在task任务,通过下面命令设置redis,(注意:设置cache时候参数加None,即cache永久不失效)

  1. from django.core.cache import cache
    class ceshitask(Task):
  2. name = "ceshi_task"
  3. def run(self, *args, **kwargs):
  4. cache.set("start-ceshi-task",值, None)
  5. return "ceshi....."

4.在views中调用

  1. from django.shortcuts import render,HttpResponse
  2. from django.core.cache import cache
  3. import json
  4.  
  5. def num_recode(request):
  6. count = cache.get("start-ceshi-task")
  7. print(json.loads(count))
  8. return HttpResponse(count)

django使用celery搭配redis配置定时任务的更多相关文章

  1. Django + Celery 实现动态配置定时任务

    哈喽,今天给大家分享一篇Django+Celery实现动态配置定时任务,因为最近也是无意间看到一位大佬关于这块的文章,然后自己觉得不错,也想学习写一下,然后最终实现功能是在前端页面统一管理计划任务,大 ...

  2. Django 使用celery任务队列的配置

    celery 情景:用户发起request,并等待response返回.在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件.手机验证码等. 使用 ...

  3. 基于Django+celery二次开发动态配置定时任务 ( 一 )

    需求: 前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统.监控,于是乎开发.测试.产品.运营.业务部.财务等等各个部门就跟那饥渴的饿狼一样需要 各种各样的系统数据满足他们.刚开始一天一个还 ...

  4. 基于Django+celery二次开发动态配置定时任务 ( 二)

    一.需求 结合上一篇,使用djcelery模块开发定时任务时,定时任务的参数都保存在djcelery_periodictask表的args.kwargs字段里,并且是json格式.那么,当定时任务多了 ...

  5. django —— Celery实现异步和定时任务

    1. 环境 python==2.7 djang==1.11.2 # 1.8, 1.9, 1.10应该都没问题 celery-with-redis==3.0 # 需要用到redis作为中间人服务(Bro ...

  6. Celery+python+redis异步执行定时任务

    我之前的一篇文章中写了[Celery+django+redis异步执行任务] 博文:http://blog.csdn.net/apple9005/article/details/54236212 你会 ...

  7. celery 动态配置定时任务

    How to dynamically add or remove tasks to celerybeat? · Issue #3493 · celery/celery https://github.c ...

  8. Django Redis配置

    Django Redis配置 # Django默认不支持redis,需要第三方插件来支持 pipenv install django-redis pipenv install hiredis # 不是 ...

  9. Django中Celery的实现介绍(一)

    Django中Celery的实现 Celery官网http://www.celeryproject.org/ 学习资料:http://docs.jinkan.org/docs/celery/ Cele ...

随机推荐

  1. SSH以及ROS远程登录设置保姆级教程

    本文用来实现在同一局域网内的两台计算机之间的相互通信,实现一台计算机登录到另一台计算机,本文基于SSH来实现. 1.SSH简介 Secure Shell(SSH)是由 IETF(The Interne ...

  2. NOIP 模拟 $14\; \text{队长快跑}$

    题解 \(by\;zj\varphi\) 一道很妙的 \(dp\) 题,方程状态不好设置,细节也不少 看到数据范围,直接想离散化 设 \(f_{i,j}\) 表示处理完前 \(i\) 个水晶,其中摧毁 ...

  3. 题解 P4111 [HEOI2015]小 Z 的房间

    题解 题目大意:给定一个无向图,求它的生成树个数. 一道裸的矩阵树定理,外加一些建图的技巧. 矩阵树定理 对于一个 \(Laplace\) 矩阵,其去掉任意一行后的行列式即为答案. 行列式不会的看这里 ...

  4. luoguP2601 对称的正方形

    题目描述 给出一个数字矩形,求这个矩形中有多少个子正方形满足上下对称.左右对称. 思路 我们可以用3个哈希数组 \(a\ b\ c\) 分别表示矩形从左上往右下看,从左下往右上看,从右上往左下看的样子 ...

  5. 熟悉而陌生的新朋友——IAsyncDisposable

    本文作者--句幽 在.NET Core 3.0的版本更新中,官方我们带来了一个新的接口 IAsyncDisposable. 小伙伴一看肯定就知道,它和.NET中原有的IDisposable接口肯定有着 ...

  6. 解析一个HTML字符串

    存在问题 来自用户输入,一个文件或一个网站的HTML字符串,你可能需要对它进行解析并取其内容,或校验其格式是否完整,或想修改它.怎么办?jsonu能够帮你轻松解决这些问题 解决方法 使用静态Jsoup ...

  7. Docker是简介

    Docker是什么  使用最广泛的开源容器引擎 一种操作系统级的虚拟化技术 依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制) 一个简单的应用程序打包工具 D ...

  8. mzy git学习,撤销修改(二)

    git checkout – file: 撤销我们对工作区的修改(没有提交到暂存区) 当我们在工作区修改了之后,并没有提交到暂存区,如果要撤销对 某个文件的修改的话,就使用 git checkout ...

  9. tomcat中修改Web站点的默认根目录

    转自:http://blog.csdn.net/wzqcongcong/article/details/6387907 想把Tomcat的默认网站根目录修改成自己指定的目录,比如:F:/MyWeb.这 ...

  10. kafka零拷贝机制

    kafka之所以那么快,其中一个很大的原因就是零拷贝(Zero-copy)技术,零拷贝不会kafka的专利,而是操作系统的升级,又比如Netty,也用到了零拷贝. 传统IO kafka的数据是要落入磁 ...