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之入门(四)运算
May 27 Python
Python open()文件处理使用介绍
Nov 30 Python
Python实现约瑟夫环问题的方法
May 03 Python
Python中functools模块的常用函数解析
Jun 30 Python
浅谈python中列表、字符串、字典的常用操作
Sep 19 Python
Python3实现带附件的定时发送邮件功能
Dec 22 Python
对python字典过滤条件的实例详解
Jan 22 Python
Python3实现从排序数组中删除重复项算法分析
Apr 03 Python
PyQt5通信机制 信号与槽详解
Aug 07 Python
完美解决pycharm 不显示代码提示问题
Jun 02 Python
Python面向对象多态实现原理及代码实例
Sep 16 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 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 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
php实现生成code128条形码的方法详解
2017/07/19 PHP
PHP页面静态化――纯静态与伪静态用法详解
2020/06/05 PHP
摘自启点的main.js
2008/04/20 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
js动态创建标签示例代码
2014/06/09 Javascript
JavaScript实现简单的拖动效果
2016/07/02 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
2017/02/13 Javascript
Vue + Vue-router 同名路由切换数据不更新的方法
2017/11/20 Javascript
详解nodejs通过响应回写的方式渲染页面资源
2018/04/07 NodeJs
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
一个小时快速搭建微信小程序的方法步骤
2019/04/15 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
功能完善的小程序日历组件的实现
2020/03/31 Javascript
解决VUEX的mapState/...mapState等取值问题
2020/07/24 Javascript
JS PHP字符串截取函数实现原理解析
2020/08/29 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
利用python程序帮大家清理windows垃圾
2017/01/15 Python
Python分析学校四六级过关情况
2017/11/22 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
深入浅析Python传值与传址
2018/07/10 Python
Python控制键盘鼠标pynput的详细用法
2019/01/28 Python
PyQt5 QTable插入图片并动态更新的实例
2019/06/18 Python
python如何使用socketserver模块实现并发聊天
2019/12/14 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
Python字符串的15个基本操作(小结)
2021/02/03 Python
资料员的岗位职责
2013/11/20 职场文书
信用社竞聘演讲稿
2014/05/16 职场文书
高中生旷课检讨书
2014/10/08 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP