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 04 Python
python获得文件创建时间和修改时间的方法
Jun 30 Python
Python中常用操作字符串的函数与方法总结
Feb 04 Python
Python3连接MySQL(pymysql)模拟转账实现代码
May 24 Python
Python中Django 后台自定义表单控件
Mar 28 Python
Python基础教程之异常详解
Jan 10 Python
python使用装饰器作日志处理的方法
Jul 11 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
Jan 20 Python
Python模拟登入的N种方式(建议收藏)
May 31 Python
Python基于execjs运行js过程解析
Nov 27 Python
Django中template for如何使用方法
Jan 31 Python
python在package下继续嵌套一个package
Apr 14 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/12/21 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
php验证码生成器
2017/05/24 PHP
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
2010/07/26 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
2013/09/03 Javascript
浅谈javascript中字符串String与数组Array
2014/12/31 Javascript
js动态切换图片的方法
2015/01/20 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
2015/03/18 Javascript
js表单提交和submit提交的区别实例分析
2015/12/10 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
vue动态设置img的src路径实例
2018/09/18 Javascript
微信小程序实现炫酷的弹出式菜单特效
2019/01/28 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
用javascript实现倒计时效果
2021/02/09 Javascript
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
Python中使用partial改变方法默认参数实例
2015/04/28 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
20佳惊艳的HTML5应用程序示例分享
2011/05/03 HTML / CSS
英国灯具和灯泡网上商店:Lights.co.uk
2018/02/02 全球购物
莫斯科珠宝厂官方网站:Miuz
2020/09/19 全球购物
政府个人对照检查材料
2014/08/28 职场文书
代理人委托书
2014/09/16 职场文书
2014大学生学生会工作总结
2014/12/19 职场文书
红旗渠导游词
2015/02/09 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
外贸业务员岗位职责
2015/02/13 职场文书
国庆节慰问信
2015/02/15 职场文书
大学生各类奖学金申请书
2019/06/24 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
Vue2.0搭建脚手架
2022/03/13 Vue.js
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA
vue自定义右键菜单之全局实现
2022/04/09 Vue.js
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python