利用 celery 实现定时任务

  celery支持定时任务,设定好任务的执行时间,celery就会定时自动帮你执行, 这个定时任务模块叫celery beat

Celery安装

由于celery 4.0 ,不再支持 Windows,故我们使用celery3.1.26 在windows环境下进行测试

安装:

  1. pip install celery==3.1..post2 django-celery==3.2. flower==0.9.

Django中配置

在主项目的配置文件settings.py 中应用注册表INSTALLED_APPS中加入 djcelery

  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. 'app01.apps.App01Config',
  9. 'djcelery', #加入djcelery
  10. ]

在settings.py 中配置celery信息

  1. import djcelery
  2. # 当djcelery.setup_loader()运行时,Celery便会去查看INSTALLD_APPS下包含的所有app目录中的tasks.py文件,找到标记为task的方法,将它们注册为celery task。
  3. djcelery.setup_loader()
  4. #broker是代理人,它负责分发任务给worker去执行。此处用的是是Redis作为broker
  5. BROKER_URL = 'redis://127.0.0.1:6379/1'
    # 导入目标任务文件
  6. CELERY_IMPORTS = ('app01.tasks')
  7. # 设置时区
  8. CELERY_TIMEZONE = 'Asia/Shanghai'
  9.  
  10. #表示使用了django-celery默认的数据库调度模型,任务执行周期都被存在默认指定的orm数据库中.
  11. CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
  12.  
  13. from celery.schedules import crontab
  14. from celery.schedules import timedelta
  15.  
  16. # 下面是定时任务的设置,我一共配置了三个定时任务.
  17. from celery.schedules import crontab
  18. CELERYBEAT_SCHEDULE = {
  19. #定时任务一: 每24小时周期执行任务(test1)
  20. u'任务一': {
  21. "task": "app01.tasks.test1",
  22. "schedule": crontab(hour='*/24'),
  23. "args": (),
  24. },
  25. #定时任务二: 每天的凌晨12:30分,执行任务(test2)
  26. u'任务二': {
  27. 'task': 'app01.tasks.test2',
  28. 'schedule': crontab(minute=30, hour=0),
  29. "args": ()
  30. },
  31. #定时任务三:每个月的1号的6:00启动,执行任务(test3)
  32. u'任务三': {
  33. 'task': 'app01.tasks.test3',
  34. 'schedule': crontab(hour=6, minute=0, day_of_month=''),
  35. "args": ()
  36. },
  37. }

创建应用实例

主工程目录添加celery.py, 添加自动检索django工程tasks任务

​ project/celery.py

  1. #目的是拒绝隐士引入,celery.py和celery冲突。
  2. from __future__ import absolute_import,unicode_literals import os
  3. from celery import Celery
  4. from django.conf import settings

  5. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
  6. #创建celery应用
  7. app = Celery('project')
  8. #You can pass the object directly here, but using a string is better since then the worker doesn’t have to serialize the object.
  9. app.config_from_object('django.conf:settings')
  10.  
  11. #如果在工程的应用中创建了tasks.py模块,那么Celery应用就会自动去检索创建的任务。比如你添加了一个任#务,在django中会实时地检索出来。
  12. app.autodiscover_tasks(lambda :settings.INSTALLED_APPS)

创建任务 tasks

每个任务本质上就是一个函数,在tasks.py中,写入你想要执行的函数即可

  1. from artproject.celery import app
  2.  
  3. @app.task
  4. def test1()
  5. pass
  6.  
  7. @app.task
  8. def test2()
  9. pass
  10.  
  11. @app.task
  12. def test2()
  13. pass

启动定时任务

启动celery beat周期任务命令:

用于启动beater,它就像一个领导,负责把任务分发给工人。

  1. celery -A proj beat

启动Celery Worker来开始监听并执行任务

beat与worker也可以同时启动,但最好只用于测试,适用于只启动一个worker节点的情况:

用于启动worker, worker本质上执行任务的线程,就是一个干苦力的工人。

  1. celery -A proj worker

beat会在当前目录下建立一个文件celerybeat-schedule来记录任务上次运行的时间,所以要保证celery对当前目录有写入的权限,或者指定文件位置:

  1. celery -A proj beat -s /home/celery/var/run/celerybeat-schedule

supervisor管理celery

先在etc/supervisord.d目录下创建一个名为uwsgi_statrt.ini的配置文件

  1. [program:redis]
  2. ;指定运行目录
  3. user=root
  4. ;执行命令(redis-server redis配置文件路径)
  5. command=redis-server /usr/local/etc/redis.conf
  6. ;
  7. ; ;启动设置
  8. numprocs=1 ;进程数
  9. autostart=true ;当supervisor启动时,程序将会自动启动
  10. autorestart=true ;自动重启
  11.  
  12. ;停止信号,默认TERM
  13. ;;中断:INT (类似于Ctrl+C)(kill -INT pid),退出后会将写文件或日志(推荐)
  14. ;;终止:TERM (kill -TERM pid)
  15. ;;挂起:HUP (kill -HUP pid),注意与Ctrl+Z/kill -stop pid不同
  16. ;;从容停止:QUIT (kill -QUIT pid)
  17. ;stopsignal=INT
  18. ; ;停止信号
  19. stopsignal=INT
  20.  
  21. ;输出日志
  22. stdout_logfile=/var/log/supervisor/redis.log
  23. stdout_logfile_maxbytes=10MB ;默认最大50M
  24. stdout_logfile_backups=10 ;日志文件备份数,默认为10
  25. ;;
  26. ;错误日志
  27. redirect_stderr=false ;为true表示禁止监听错误
  28. stderr_logfile=/var/log/supervisor/redis_err.log
  29. stderr_logfile_maxbytes=10MB
  30. stderr_logfile_backups=10
  31.  
  32. [program:celery.worker]
  33. ;指定运行目录
  34. user=root
  35. directory=/home/project/thinking_library
  36. ;运行目录下执行命令
  37. command=/home/env/thinking_library/bin/celery -A thinking_library worker --loglevel info --logfile celery_worker.log
  38. ;
  39. ; ;启动设置
  40. numprocs=1 ;进程数
  41. autostart=true ;当supervisor启动时,程序将会自动启动
  42. autorestart=true ;自动重启
  43. ;
  44. ; ;停止信号,默认TERM
  45. ; ;中断:INT (类似于Ctrl+C)(kill -INT pid),退出后会将写文件或日志(推荐)
  46. ; ;终止:TERM (kill -TERM pid)
  47. ; ;挂起:HUP (kill -HUP pid),注意与Ctrl+Z/kill -stop pid不同
  48. ; ;从容停止:QUIT (kill -QUIT pid)
  49. stopsignal=INT
  50.  
  51. ;输出日志
  52. stdout_logfile=/var/log/supervisor/celery_worker.log
  53. stdout_logfile_maxbytes=10MB ;默认最大50M
  54. stdout_logfile_backups=10 ;日志文件备份数,默认为10
  55. ;
  56. ; ;错误日志
  57. redirect_stderr=false ;为true表示禁止监听错误
  58. stderr_logfile=/var/log/supervisor/celery_worker_err.log
  59. stderr_logfile_maxbytes=10MB
  60. stderr_logfile_backups=10
  61.  
  62. [program:celery.beat]
  63. ;指定运行目录
  64. user=root
  65. directory=/home/project/thinking_library
  66. ;;运行目录下执行命令
  67. command=/home/env/thinking_library/bin/celery -A thinking_library worker --loglevel info --logfile celery_beat.log
  68. ;
  69. ; ;启动设置
  70. numprocs=1 ;进程数
  71. autostart=true ;当supervisor启动时,程序将会自动启动
  72. autorestart=true ;自动重启
  73. ;
  74. ; ;停止信号
  75. stopsignal=INT
  76.  
  77. ;输出日志
  78. stdout_logfile=/var/log/supervisor/celery_beat.log
  79. stdout_logfile_maxbytes=10MB ;默认最大50M
  80. stdout_logfile_backups=10 ;日志文件备份数,默认为10
  81. ;
  82. ; ;错误日志
  83. redirect_stderr=false ;为true表示禁止监听错误
  84. stderr_logfile=/var/log/supervisor/celery_worker_err.log
  85. stderr_logfile_maxbytes=10MB
  86. stderr_logfile_backups=10

celeryworker.ini

错误提醒:

测试时启动过一次Beat,beat按理说是只能启动一个的但是不服务器都重启过了还是提示已有进程在运行。

ERROR: Pidfile (celerybeat.pid) already exists. Seems we're already running? (pid: 11068)

解决方法:

删除项目下 celertbeat.pid文件即可

django+celery 实现定时任务的更多相关文章

  1. django celery redis 定时任务

    0.目的 在开发项目中,经常有一些操作时间比较长(生产环境中超过了nginx的timeout时间),或者是间隔一段时间就要执行的任务. 在这种情况下,使用celery就是一个很好的选择.   cele ...

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

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

  3. Django Celery定时任务和时间设置

    1.Celery加入定时任务 Celery除了可以异步执行任务之外,还可以定时执行任务.在实例代码的基础上写个测试方法: #coding:utf- from celery.task.schedules ...

  4. Django中使用Celery实现定时任务(用djcelery)

    一.引言 Django是python语言下的一个比较热门的Web框架,越来越多的企业和开发者使用Django实现自己的Web服务器.在Web服务器开发过程中,有时候我们不仅仅是要实现Web服务器端和用 ...

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

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

  6. django+celery+redis实现运行定时任务

    0.目的 在开发项目中,经常有一些操作时间比较长(生产环境中超过了nginx的timeout时间),或者是间隔一段时间就要执行的任务. 在这种情况下,使用celery就是一个很好的选择.   cele ...

  7. Bamboo Django Celery定时任务和时间设置

    1.Celery加入定时任务 Celery除了可以异步执行任务之外,还可以定时执行任务.在实例代码的基础上写个测试方法: 1 #coding:utf-8 2 from celery.task.sche ...

  8. Django+Celery框架自动化定时任务开发

    本章介绍使用DjCelery即Django+Celery框架开发定时任务功能,在Autotestplat平台上实现单一接口自动化测试脚本.业务场景接口自动化测试脚本.App自动化测试脚本.Web自动化 ...

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

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

随机推荐

  1. I2C和SPI

    I2C(Inter-Integrated Circuit)总线 两线式串行总线,用于连接微控制器及其外围设备.是微电子通信控制领域广泛采用的一种总线标准.它是同步通信的一种特殊形式,具有接口线少,控制 ...

  2. Hibernate Annotation 字段 默认值

    http://emavaj.blog.163.com/blog/static/133280557201032262741999/ ——————————————————————————————————— ...

  3. js学习笔记24----焦点事件

    事件: onfous : 元素获取焦点时触发事件 onblur : 元素失去焦点时触发事件 方法: obj.focus(); 可指定元素设置焦点 obj.blur(); 取消指定元素的焦点 obj.s ...

  4. 003Maven_Maven核心概念

    Maven核心概念 Maven插件 Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的每个插件都能实现多个功能,每个功能就是一个插件目标 Maven的生命周期与插件目标相互绑定,以 ...

  5. 学习:erlang读取文件中的terms

    参考:http://diaocow.iteye.com/blog/1766128 1. file:consult(Filename) -> {ok, Terms} | {error, Reaso ...

  6. Android 扩展OkHttp支持请求优先级调度

    在当今这个App泛滥的时代,网络请求差点儿是每个App不可缺少的一部分.请求差点儿遍布App的每个界面中.我们进入A界面后.App发起了一系列请求,这时候假如另一部分请求没有被运行,我们就进入B界面開 ...

  7. 剑指 offer set 15 第一个只出现一次的字符

    题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符 思路: 1. 给定的题目约束比较多, 因此可以自定义哈希函数 2. 字符是一个长 ...

  8. 83、android的消息处理机制(图+源码分析)——Looper,Handler,Message

    转载:http://www.cnblogs.com/codingmyworld/archive/2011/09/12/2174255.html https://my.oschina.net/u/139 ...

  9. iOS 按钮文字加划掉线

    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(, , , )]; NSDictionary *normalTitleAttribu ...

  10. 文艺青年、普通青年、2b青年到底是什么意思?

    文艺青年.普通青年.2b青年到底是什么意思? 文艺青年就是脑子里跟别人想的不一样,思维跟人家相反或者另类的人. 普通青年呢就是像你一样,普普通通的. 2B青年就是黑铅笔青年,做事比较搞怪,古怪到让你哭 ...