利用 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. C++ 类的继承一(访问控制)

    //类的继承 #include<iostream> using namespace std; /* 面向对象中的继承类之间的父子关系 1.子类拥有父类所有的成员属性和成员函数(包括私有成员 ...

  2. iconfont补遗

    一.TureTpe(.ttf)格式: .ttf字体是Windows和Mac的最常见的字体,是一种RAW格式,因此他不为网站优化,支持这种字体的浏览器有[IE9+,Firefox3.5+,Chrome4 ...

  3. 第二百七十九节,MySQL数据库-pymysql模块操作数据库

    MySQL数据库-pymysql模块操作数据库 pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数使用方式: 模块名称.connec ...

  4. 一个区域只能放置一个组件,如果想在一个区域放置多个组件就需要使用Panel来装载

    五种布局管理器: Flow Layout(流式布局):按照组件添加到容器中的顺序,顺序排放组件位置.默认为水平排列,如果越界那么会向下排列.排列的位置随着容器大小的改变而改变. Panel默认的布局管 ...

  5. UP与瀑布模型

    软件开发过程(Software development process)描述了构造.部署以及维护软件的方式.(就是先做什么后做什么)统一过程(The Unified Software Developm ...

  6. 在执行一行代码之前CLR做的68件事[The 68 things the CLR does before executing a single line of your code]

    待翻译,原文地址:http://mattwarren.org/2017/02/07/The-68-things-the-CLR-does-before-executing-a-single-line- ...

  7. C# 压缩和解压文件(SharpZipLib)

    先从网上下载ICSharpCode.SharpZipLib.dll类库 将文件或文件夹压缩为zip,函数如下 /// <summary> /// 压缩文件 /// </summary ...

  8. 如何改变placeholder的样式

    input::-webkit-input-placeholder { color: #B2B2B2; } input:-moz-placeholder { color: #B2B2B2; } inpu ...

  9. CentOS 6.5 配置IP地址的三种方法

    1.自动获取IP地址虚拟机使用桥接模式,相当于连接到物理机的网络里,物理机网络有DHCP服务器自动分配IP地址.#dhclient 自动获取ip地址命令#ifconfig 查询系统里网卡信息,ip地址 ...

  10. 用DX9画三角形,三个顶点要求

      用DX9画三角形,三个顶点的顺序有要求吗下面是全部代码,在 InitVB 函数中被注释掉的数组是我写的,没注释掉的是书上的代码,经过试验我的坐标不能显示出图形,而书上的坐标可以,这是为什么? #i ...