利用 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. 专题实验 Toad 用户的创建与管理( 包括 role 等 )

    1. 用户登录数据库 是否可以通过操作系统权限来登录数据库, $ORACLE_HOME/network/admin/sqlnet.ora 这个文件中设置, 如果增加参数sqlnet.authentic ...

  2. ci框架简单出现的错误[Undefined property: MContacts::$db]

    出现这样的错误时说明自己忘记加载数据库了, application/config/aotuload.php     $autoload['libraries'] = array('database') ...

  3. 最新Android面试题集锦

    近期由于某些原因想换工作,整理一下个人认为面试中还比較值得记录的一些题目,给须要找这方面工作的人一个借鉴. 下面基本仅仅记录题目或者大概答案,假设大家有比較具体的解答或者比較好的面试题木,希望各位看到 ...

  4. linux配置防火墙打开3306端口

      安装完MYSQL服务器后在本机所有操作都正常, 但在其它机器上远程访问这个MYSQL服务器时怎么都连接不上.  shit! 怀疑是端口问题, 结果: telnet 192.168.1.245 33 ...

  5. VC++ 窗口拆分CSplitterWnd

    前言         当前许多优秀的软件都采用“多视”技术. 所谓“多视”,是指在同一个框架窗口里同时显示多个视图. 通过运用这种技术,可以在框架的有限控件内同时提供用户更大的信息量,并且使得用户界面 ...

  6. 一次清除SQL SERVER错误日志的体会!

    之前在UAT环境搭建的SQL SERVER 2008 R2数据库一直用得比较正常,但最近发现在Sharepoint中不能进行任何操作了,开始以为是什么配置出了问题(因为一直在研究一些新的应用和集成,需 ...

  7. iOS开发之--FMDB的使用

    在很多时候,我们会用到数据库,我们移动端使用的数据库,一般都是嵌入型数据库,是一种较轻型的数据库, 一般很多时候,大牛封装的FMDB的第三方,已经足够满足我们的需求了! 现在分享一下自己的学习心得,希 ...

  8. 应用开发之Asp.net

    本章简言 上一章中笔者讲到关于Linq和EF的用法.并以hibernate来进行讲解.那么本章笔者来讲一下C#的Asp.Net.即是在B/S模式下开发.现在企业大部分的业务都是面向B/S模式的.所以对 ...

  9. NData转化

    NSdata 与 NSString,Byte数组,UIImage 的相互转换---ios开发 Objective-C 1. NSData 与 NSStringNSData-> NSStringN ...

  10. 六 Android Studio打包Eegret App (解决开机黑屏问题)

    因为android studio中的SplashActivity并没有什么卵用,只是开机1s显示开机画面,1s后面还是黑屏. 在主文件中加入以下代码,就是开始游戏时显示一个居中填满屏幕的图片,游戏加载 ...