利用 celery 实现定时任务

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

Celery安装

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

安装:

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

Django中配置

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

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
'djcelery', #加入djcelery
]

在settings.py 中配置celery信息

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

创建应用实例

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

​ project/celery.py

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

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

创建任务 tasks

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

from artproject.celery import app

@app.task
def test1()
pass @app.task
def test2()
pass @app.task
def test2()
pass

启动定时任务

启动celery beat周期任务命令:

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

 celery -A proj beat

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

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

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

celery -A proj worker

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

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

supervisor管理celery

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

[program:redis]
;指定运行目录
user=root
;执行命令(redis-server redis配置文件路径)
command=redis-server /usr/local/etc/redis.conf
;
; ;启动设置
numprocs=1 ;进程数
autostart=true ;当supervisor启动时,程序将会自动启动
autorestart=true ;自动重启 ;停止信号,默认TERM
;;中断:INT (类似于Ctrl+C)(kill -INT pid),退出后会将写文件或日志(推荐)
;;终止:TERM (kill -TERM pid)
;;挂起:HUP (kill -HUP pid),注意与Ctrl+Z/kill -stop pid不同
;;从容停止:QUIT (kill -QUIT pid)
;stopsignal=INT
; ;停止信号
stopsignal=INT ;输出日志
stdout_logfile=/var/log/supervisor/redis.log
stdout_logfile_maxbytes=10MB ;默认最大50M
stdout_logfile_backups=10 ;日志文件备份数,默认为10
;;
;错误日志
redirect_stderr=false ;为true表示禁止监听错误
stderr_logfile=/var/log/supervisor/redis_err.log
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=10 [program:celery.worker]
;指定运行目录
user=root
directory=/home/project/thinking_library
;运行目录下执行命令
command=/home/env/thinking_library/bin/celery -A thinking_library worker --loglevel info --logfile celery_worker.log
;
; ;启动设置
numprocs=1 ;进程数
autostart=true ;当supervisor启动时,程序将会自动启动
autorestart=true ;自动重启
;
; ;停止信号,默认TERM
; ;中断:INT (类似于Ctrl+C)(kill -INT pid),退出后会将写文件或日志(推荐)
; ;终止:TERM (kill -TERM pid)
; ;挂起:HUP (kill -HUP pid),注意与Ctrl+Z/kill -stop pid不同
; ;从容停止:QUIT (kill -QUIT pid)
stopsignal=INT ;输出日志
stdout_logfile=/var/log/supervisor/celery_worker.log
stdout_logfile_maxbytes=10MB ;默认最大50M
stdout_logfile_backups=10 ;日志文件备份数,默认为10
;
; ;错误日志
redirect_stderr=false ;为true表示禁止监听错误
stderr_logfile=/var/log/supervisor/celery_worker_err.log
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=10 [program:celery.beat]
;指定运行目录
user=root
directory=/home/project/thinking_library
;;运行目录下执行命令
command=/home/env/thinking_library/bin/celery -A thinking_library worker --loglevel info --logfile celery_beat.log
;
; ;启动设置
numprocs=1 ;进程数
autostart=true ;当supervisor启动时,程序将会自动启动
autorestart=true ;自动重启
;
; ;停止信号
stopsignal=INT ;输出日志
stdout_logfile=/var/log/supervisor/celery_beat.log
stdout_logfile_maxbytes=10MB ;默认最大50M
stdout_logfile_backups=10 ;日志文件备份数,默认为10
;
; ;错误日志
redirect_stderr=false ;为true表示禁止监听错误
stderr_logfile=/var/log/supervisor/celery_worker_err.log
stderr_logfile_maxbytes=10MB
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. linux 安装开启SNMP协议,最下面是yum安装

    Linux SNMP 以下的示例采用SUSE10 Linux环境,但它同样适用于其它Linux发行版. 编译和安装 首先我们需要下载Net-SNMP的源代码,选择一个版本,比如5.7.1,地址如下: ...

  2. HTML5关于上传API的一些使用(中)

    上一次写了关于HTML的上传API,XMLHttpRequest2.0的上传方式,以及HTML5中上传之前本地的预览,包括对于图片以及部分信息的预 览.这次我们就讲下HTML5中关于上传的一些各种个性 ...

  3. Spring Cloud 架构

    我们从整体来看一下Spring Cloud主要的组件,以及它的访问流程 1.外部或者内部的非Spring Cloud项目都统一通过API网关(Zuul)来访问内部服务. 2.网关接收到请求后,从注册中 ...

  4. sours insight 使用技巧

    最终在团队的气氛下还是拿回了source insight编译器: Source Insight实质上是一个支持多种开发语言(java,c ,c 等等)的编辑器,只不过由于其查找.定位.彩色显示等功能的 ...

  5. 【Python】用文本打印树

    From:http://zhidao.baidu.com/link?url=O8U5TynGBMojDw2iFhlghPPf5_ZE1X8CAQMrK19pv-KxhvKCc6Z2yzsoQaukgN ...

  6. 隐马尔可夫树(HMT模型)

    HMT(Hidden Markov Tree)隐马尔可夫树 [论文] 小波变换与HMT模型的图像插值算法-郭昌-中山大学学报(自然科学版)

  7. SQL语句:语法错误(操作符丢失)在查询表达式中

    所谓操作符丢失,应该是你在拼接SQL语句是少了关键词或者分隔符,导致系统无法识别SQL语句.建议:1.监控SQL语句,看看哪里出现问题:断点看下最后的sql到底是什么样子就知道了,另外你可以把这段sq ...

  8. Lumen Carbon 日期及时间处理包

    用到过的方法: 获取当前Y-m-d H:i:s Carbon::now()->toDateTimeString() 把 Y-m-d H:i:s 转 Y-m-d Carbon::parse('Y- ...

  9. 用SQL语句创建触发器

    --假设XSCJ数据库中增加一新表XS_HIS,表结构和表XS相同,用来存放从XS--表 --中删除的记录.创建一个触发器,当XS表被删除一行,把删除的记录写到日--志表XS_HIS中. CREATE ...

  10. 【BZOJ4231】回忆树 离线+fail树+KMP

    [BZOJ4231]回忆树 Description 回忆树是树. 具体来说,是n个点n-1条边的无向连通图,点标号为1~n,每条边上有一个字符(出于简化目的,我们认为只有小写字母). 对一棵回忆树来说 ...