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之折腾一下目录
Oct 24 Python
Python数据结构之顺序表的实现代码示例
Nov 15 Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 Python
Python Pandas 获取列匹配特定值的行的索引问题
Jul 01 Python
pandas 使用均值填充缺失值列的小技巧分享
Jul 04 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
Aug 05 Python
Python3 使用pillow库生成随机验证码
Aug 26 Python
浅谈django url请求与数据库连接池的共享问题
Aug 29 Python
PYTHON EVAL的用法及注意事项解析
Sep 06 Python
Python 跨.py文件调用自定义函数说明
Jun 01 Python
Python Numpy之linspace用法说明
Apr 17 Python
解决Python中的modf()函数取小数部分不准确问题
May 28 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初学者头疼问题总结
2006/07/08 PHP
php excel类 phpExcel使用方法介绍
2010/08/21 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
jquery validation验证身份证号,护照,电话号码,email(实例代码)
2013/11/06 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
2014/05/09 Javascript
node.js中的http.response.getHeader方法使用说明
2014/12/14 Javascript
使用pjax实现无刷新更改页面url
2015/02/05 Javascript
JavaScript中用getDate()方法返回指定日期的教程
2015/06/09 Javascript
BootStrap注意事项小结(五)表单
2017/03/10 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
django框架如何集成celery进行开发
2017/05/24 Python
利用Python写一个爬妹子的爬虫
2018/06/08 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
python用post访问restful服务接口的方法
2018/12/07 Python
基于Python函数和变量名解析
2019/07/19 Python
详解Python 4.0 预计推出的新功能
2019/07/26 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
基于python的docx模块处理word和WPS的docx格式文件方式
2020/02/13 Python
python 回溯法模板详解
2020/02/26 Python
python开发前景如何
2020/06/11 Python
中专自我鉴定
2014/02/05 职场文书
广告语设计及教案
2014/03/21 职场文书
巾帼志愿者活动方案
2014/08/17 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
人生一定要学会的三样东西:放下、忘记、珍惜
2019/08/21 职场文书
Java 关于String字符串原理上的问题
2022/04/07 Java/Android
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android