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 相关文章推荐
详解Python2.x中对Unicode编码的使用
Apr 03 Python
基于python的七种经典排序算法(推荐)
Dec 08 Python
Django+Ajax+jQuery实现网页动态更新的实例
May 28 Python
使用 python pyautogui实现鼠标键盘控制功能
Aug 04 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
简单瞅瞅Python vars()内置函数的实现
Sep 27 Python
Python基于gevent实现高并发代码实例
May 15 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
Aug 07 Python
python 实现socket服务端并发的四种方式
Dec 14 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
Jan 10 Python
Python 调用C++封装的进一步探索交流
Mar 04 Python
解决Django transaction进行事务管理踩过的坑
Apr 24 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 第二节 数据类型之字符串类型
2012/04/28 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
PHP异常处理Exception类
2015/12/11 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
2016/04/28 PHP
PHP实现小程序批量通知推送
2018/11/27 PHP
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2010/02/04 Javascript
让innerText在firefox火狐和IE浏览器都能用的写法
2011/05/14 Javascript
多浏览器兼容性比较好的复制到剪贴板的js代码
2011/10/09 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
nodejs npm package.json中文文档
2014/09/04 NodeJs
探讨JavaScript语句的执行过程
2016/01/28 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
2016/05/25 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
浅谈jQuery before和insertBefore的区别
2016/12/04 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
用Axios Element实现全局的请求loading的方法
2018/03/15 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
[41:17]VG vs Optic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
使用Python的Treq on Twisted来进行HTTP压力测试
2015/04/16 Python
Python读取Excel的方法实例分析
2015/07/11 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
python email smtplib模块发送邮件代码实例
2018/04/26 Python
python实现在图片上画特定大小角度矩形框
2018/10/24 Python
python中for in的用法详解
2020/04/17 Python
Python3如何在服务器打印资产信息
2020/08/27 Python
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
2012/12/13 HTML / CSS
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
天巡全球:Skyscanner Global
2017/06/20 全球购物
美国Randolph太阳镜官网:美国制造的飞行员太阳镜和射击眼镜
2018/06/15 全球购物
外包公司软件测试工程师
2014/11/01 面试题
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
给老婆的保证书
2015/01/16 职场文书
趣味运动会广播稿
2015/08/19 职场文书
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python