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新手编程过程中如何规避一些常见问题的建议
Apr 01 Python
深入讲解Python中的迭代器和生成器
Oct 26 Python
基于python实现在excel中读取与生成随机数写入excel中
Jan 04 Python
python将字典内容存入mysql实例代码
Jan 18 Python
Python第三方库h5py_读取mat文件并显示值的方法
Feb 08 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
用python建立两个Y轴的XY曲线图方法
Jul 08 Python
Python 写入训练日志文件并控制台输出解析
Aug 13 Python
python实现录屏功能(亲测好用)
Mar 02 Python
简单了解python列表和元组的区别
May 14 Python
用pandas划分数据集实现训练集和测试集
Jul 20 Python
解决pytorch 数据类型报错的问题
Mar 03 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/10/09 PHP
php curl_init函数用法
2014/01/31 PHP
php解析xml方法实例详解
2015/05/12 PHP
PHP中常用的魔术方法
2017/04/28 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
利用XMLHTTP传递参数在另一页面执行并刷新本页
2006/10/26 Javascript
在JavaScript中,为什么要尽可能使用局部变量?
2009/04/06 Javascript
js 模拟气泡屏保效果代码
2010/07/10 Javascript
javascript正则表达式中参数g(全局)的作用
2010/11/11 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
2017/01/13 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
node.js连接MongoDB数据库的2种方法教程
2017/05/17 Javascript
bootstrap中日历范围选择插件daterangepicker的使用详解
2018/04/17 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
2018/08/27 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
2018/11/02 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
[01:30:54]《加油DOTA》 第三期
2014/08/18 DOTA
python实现画一颗树和一片森林
2018/06/25 Python
python中数字是否为可变类型
2020/07/08 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
css3中检验表单的required,focus,valid和invalid样式
2014/02/21 HTML / CSS
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
应届生程序员求职信
2013/11/05 职场文书
中学生操行评语
2014/04/24 职场文书
法英专业大学生职业生涯规划书范文
2014/09/22 职场文书
会计岗位职责
2015/02/03 职场文书
党小组意见范文
2015/06/08 职场文书
《酸的和甜的》教学反思
2016/02/18 职场文书
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL