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语言技巧之三元运算符使用介绍
Mar 04 Python
django中的setting最佳配置小结
Nov 21 Python
django 解决manage.py migrate无效的问题
May 27 Python
Python求一批字符串的最长公共前缀算法示例
Mar 02 Python
Python使用sax模块解析XML文件示例
Apr 04 Python
Python使用matplotlib 模块scatter方法画散点图示例
Sep 27 Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 Python
python多线程并发及测试框架案例
Oct 15 Python
Python彻底删除文件夹及其子文件方式
Dec 23 Python
Keras预训练的ImageNet模型实现分类操作
Jul 07 Python
python判断变量是否为列表的方法
Sep 17 Python
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
May 25 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生成静态HTML速度快类库
2007/03/18 PHP
php FPDF类库应用实现代码
2009/03/20 PHP
php实现aes加密类分享
2014/02/16 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
Javascript & DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
网上应用的一个不错common.js脚本
2007/08/08 Javascript
jquery animate图片模向滑动示例代码
2011/01/26 Javascript
基于jquery的web页面日期格式化插件
2011/11/15 Javascript
js中创建对象的几种方式示例介绍
2014/01/26 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
2016/07/01 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
react-native-video实现视频全屏播放的方法
2018/03/19 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
js使用Promise实现简单的Ajax缓存
2018/11/14 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
详解js中的几种常用设计模式
2020/07/16 Javascript
Windows下安装python2.7及科学计算套装
2015/03/05 Python
python实现简单多人聊天室
2018/12/11 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
Python3标准库glob文件名模式匹配的问题
2020/03/13 Python
解决Keras 自定义层时遇到版本的问题
2020/06/16 Python
Python 测试框架unittest和pytest的优劣
2020/09/26 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
函数指针的定义是什么
2016/08/14 面试题
工厂保安员岗位职责
2014/01/31 职场文书
四群教育工作实施方案
2014/03/26 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android
MySQL子查询中order by不生效问题的解决方法
2021/08/02 MySQL
Python OpenCV形态学运算示例详解
2022/04/07 Python