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 相关文章推荐
django 自定义用户user模型的三种方法
Nov 18 Python
Python中实现结构相似的函数调用方法
Mar 10 Python
简单的编程0基础下Python入门指引
Apr 01 Python
Django框架下在URLconf中指定视图缓存的方法
Jul 23 Python
Python基于分水岭算法解决走迷宫游戏示例
Sep 26 Python
Python实现简单查找最长子串功能示例
Feb 26 Python
Python处理时间日期坐标轴过程详解
Jun 25 Python
Python:Numpy 求平均向量的实例
Jun 29 Python
tensorflow-gpu安装的常见问题及解决方案
Jan 20 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
Aug 31 Python
python字符串常规操作大全
May 02 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 超链接 抓取实现代码
2009/06/29 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
2011/10/31 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
解析php中eclipse 用空格替换 tab键
2013/06/24 PHP
PHP编写文件多服务器同步程序
2016/07/02 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
javascript 单选框,多选框美化代码
2008/08/01 Javascript
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
JavaScript重载函数实例剖析
2016/05/13 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
详解自动生成博客目录案例
2016/12/09 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
2017/02/16 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
vue-router 按需加载 component: () => import() 报错的解决
2020/09/22 Javascript
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
python写入文件自动换行问题的方法
2019/07/05 Python
python如何保存文本文件
2020/06/07 Python
Python实现加密的RAR文件解压的方法(密码已知)
2020/09/11 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
Myprotein台湾官方网站:全球领先的运动营养品牌
2018/12/10 全球购物
JS原生实现轮播图的几种方法
2021/03/23 Javascript
初中体育教学反思
2014/01/14 职场文书
给女儿的表扬信
2014/01/18 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
逃课检讨书
2015/01/26 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android
JavaScript中document.activeELement焦点元素介绍
2021/11/27 Javascript
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers
聊聊配置 Nginx 访问与错误日志的问题
2022/05/25 Servers