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的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
深入理解python对json的操作总结
Jan 05 Python
python使用两种发邮件的方式smtp和outlook示例
Jun 02 Python
Python+Turtle动态绘制一棵树实例分享
Jan 16 Python
python在每个字符后添加空格的实例
May 07 Python
python3 读取Excel表格中的数据
Oct 16 Python
详解pytorch 0.4.0迁移指南
Jun 16 Python
python 画二维、三维点之间的线段实现方法
Jul 07 Python
Python常用模块os.path之文件及路径操作方法
Dec 03 Python
python飞机大战pygame游戏背景设计详解
Dec 17 Python
JupyterNotebook 输出窗口的显示效果调整方法
Apr 13 Python
pytorch 中autograd.grad()函数的用法说明
May 12 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连接mssql数据库的几种方法
2013/02/21 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
php短址转换实现方法
2015/02/25 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
接收键盘指令的脚本
2006/06/26 Javascript
JavaScript 变量基础知识
2009/11/07 Javascript
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
2010/03/07 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
js实现图片放大缩小功能后进行复杂排序的方法
2012/11/08 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
jquery 无限级联菜单案例分享
2013/03/26 Javascript
JS设置获取cookies的方法
2014/01/26 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
2015/12/03 Javascript
requireJS使用指南
2016/04/27 Javascript
很实用的js选项卡切换效果
2016/08/12 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
2017/04/21 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
详解JavaScript中的六种错误类型
2017/09/21 Javascript
JS实现对json对象排序并删除id相同项功能示例
2018/04/18 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
JS实现页面跳转与刷新的方法汇总
2019/08/30 Javascript
微信小程序实现写入读取缓存详解
2019/08/30 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
HTML实现代码雨源码及效果示例
2020/02/25 HTML / CSS
美国运动鞋和运动服零售商:Footaction
2017/04/07 全球购物
使用CSS连接数据库的方式
2022/02/28 HTML / CSS
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫