python Celery定时任务的示例


Posted in Python onMarch 13, 2018

本文介绍了python Celery定时任务的示例,分享给大家,具体如下:

配置

启用Celery的定时任务需要设置CELERYBEAT_SCHEDULE 。

python Celery定时任务的示例

Celery的定时任务都由celery beat来进行调度。celery beat默认按照settings.py之中的时区时间来调度定时任务。

创建定时任务

一种创建定时任务的方式是配置CELERYBEAT_SCHEDULE:

#每30秒调用task.add
from datetime import timedelta

CELERYBEAT_SCHEDULE = {
  'add-every-30-seconds': {
    'task': 'tasks.add',
    'schedule': timedelta(seconds=30),
    'args': (16, 16)
  },
}
#crontab任务
#每周一7:30调用task.add
from celery.schedules import crontab

CELERYBEAT_SCHEDULE = {
  # Executes every Monday morning at 7:30 A.M
  'add-every-monday-morning': {
    'task': 'tasks.add',
    'schedule': crontab(hour=7, minute=30, day_of_week=1),
    'args': (16, 16),
  },
}

使用数据库存储定时任务

使用数据库存储定时任务需要设置CELERYBEAT_SCHEDULE如下:

python Celery定时任务的示例

import datetime
import json
from djcelery import models as celery_models
from django.utils import timezone
#创建任务
def create_task(name, task, task_args, crontab_time):
  '''
  name # 任务名字
  task # 执行的任务 "myapp.tasks.add"
  task_args # 任务参数 {"x":1, "Y":1}

  crontab_time # 定时任务时间 格式:
  {
    'month_of_year': 9 # 月份
    'day_of_month': 5 # 日期
    'hour': 01 # 小时
    'minute':05 # 分钟
  }
  '''

  # task任务, created是否定时创建
  task, created = celery_models.PeriodicTask.objects.
              get_or_create(name=name,task=task)
  # 获取 crontab
  crontab = celery_models.CrontabSchedule.objects.
              filter(**crontab_time).first()
  if crontab is None:
  # 如果没有就创建,有的话就继续复用之前的crontab
    crontab = celery_models.CrontabSchedule.objects.
              create(**crontab_time)
  task.crontab = crontab # 设置crontab
  task.enabled = True # 开启task
  task.kwargs = json.dumps(task_args) # 传入task参数
  expiration = timezone.now() + datetime.timedelta(day=1)
  task.expires = expiration # 设置任务过期时间为现在时间的一天以后
  task.save()
  return True 

#关闭任务
def disable_task(name):
'''
关闭任务
'''
  try:
    task = celery_models.PeriodicTask.objects.get(name=name)
    task.enabled = False # 设置关闭
    task.save()
    return True
  except celery_models.PeriodicTask.DoesNotExist:
    return True

启动beat

执行定时任务时, Celery会通过celery beat进程来完成。Celery beat会保持运行, 一旦到了某一定时任务需要执行时, Celery beat便将其加入到queue中. 不像worker进程, Celery beat只需要一个即可。而且为了避免有重复的任务被发送出去,所以Celery beat仅能有一个。

启动:

python manage.py celery beat --loglevel=info

其实还有一种简单的启动方式worker和beat一起启动:

python manage.py celery worker --loglevel=info --beat

定时删除

由于很多任务都是一次执行完就不需要,留在数据库里就是垃圾数据了有没有办法清除。方法肯定有因为django-celery本身就有定时任务功能我们加个任务就解决了。好我们看代码:在django app目录中打开taske.py加入如下代码

from djcelery import models as celery_models
from django.utils import timezone
@task()
def delete():
  '''
  删除任务
  从models中过滤出过期时间小于现在的时间然后删除
  '''
  return celery_models.PeriodicTask.objects.filter(
              expires__lt=timezone.now()).delete()

创建任务脚本里设置了 expires 1天以后过期,这样在filter的时候就能当做条件把过期的任务找到并且删除。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python发送HTTP请求的方法小结
Jul 08 Python
python实现中文分词FMM算法实例
Jul 10 Python
Python环境下搭建属于自己的pip源的教程
May 05 Python
python编码总结(编码类型、格式、转码)
Jul 01 Python
Python获取某一天是星期几的方法示例
Jan 17 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
对Python的多进程锁的使用方法详解
Feb 18 Python
在django admin中添加自定义视图的例子
Jul 26 Python
Python包,__init__.py功能与用法分析
Jan 07 Python
pycharm安装及如何导入numpy
Apr 03 Python
Python通过文本和图片生成词云图
May 21 Python
python实现计算图形面积
Feb 22 Python
人脸识别经典算法一 特征脸方法(Eigenface)
Mar 13 #Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
Mar 13 #Python
Python+Django搭建自己的blog网站
Mar 13 #Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 #Python
tensorflow实现softma识别MNIST
Mar 12 #Python
wxpython实现图书管理系统
Mar 12 #Python
人生苦短我用python python如何快速入门?
Mar 12 #Python
You might like
php数组去重的函数代码
2013/02/03 PHP
php之CodeIgniter学习笔记
2013/06/17 PHP
PHP中加密解密函数与DES加密解密实例
2014/10/17 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
2015/02/10 PHP
php与python实现的线程池多线程爬虫功能示例
2016/10/12 PHP
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
js验证模型自我实现的具体方法
2013/06/21 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
vue.js学习笔记:如何加载本地json文件
2017/01/17 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
2018/09/02 Javascript
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
详解element-ui级联菜单(城市三级联动菜单)和回显问题
2019/10/02 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
Python通过select实现异步IO的方法
2015/06/04 Python
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
如何编写python的daemon程序
2021/01/07 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
大专生的学习自我评价
2013/12/04 职场文书
企业读书活动总结
2014/06/30 职场文书
火烧圆明园观后感
2015/06/03 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
公司人事管理制度
2015/08/05 职场文书
资深HR教你写好简历中的自我评价
2019/05/07 职场文书
缓存替换策略及应用(以Redis、InnoDB为例)
2021/07/25 Redis
CSS list-style-type属性使用方法
2023/05/21 HTML / CSS