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版本中maketrans()方法的使用介绍
May 19 Python
常见的python正则用法实例讲解
Jun 21 Python
python traceback捕获并打印异常的方法
Aug 31 Python
Python简易版停车管理系统
Aug 12 Python
Python Django 简单分页的实现代码解析
Aug 21 Python
Python 可变类型和不可变类型及引用过程解析
Sep 27 Python
Python+Redis实现布隆过滤器
Dec 08 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
Python 实现使用空值进行赋值 None
Mar 12 Python
Python SMTP配置参数并发送邮件
Jun 16 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
Jun 23 Python
python中id函数运行方式
Jul 03 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中加session验证)
2012/08/22 PHP
Yii框架关联查询with用法分析
2014/12/02 PHP
CI框架入门之MVC简单示例
2016/11/21 PHP
PHP中Cookie的使用详解(简单易懂)
2017/04/28 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
phpfpm的作用和用法
2019/10/10 PHP
prototype 中文参数乱码解决方案
2009/11/09 Javascript
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
Jquery实现Div上下移动示例
2014/04/23 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
iScroll.js 使用方法参考
2016/05/16 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
2019/02/27 jQuery
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
微信小程序使用车牌号输入法的示例代码
2019/08/20 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
Python tempfile模块学习笔记(临时文件)
2014/05/25 Python
老生常谈Python基础之字符编码
2017/06/14 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
2019/08/09 Python
利用python-docx模块写批量生日邀请函
2019/08/26 Python
python实现126邮箱发送邮件
2020/05/20 Python
为什么称python为胶水语言
2020/06/16 Python
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
高性能装备提升营地:Kammok
2019/02/27 全球购物
企业安全生产责任书范本
2014/07/28 职场文书
市场督导岗位职责
2015/04/10 职场文书
校运会广播稿
2015/08/19 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server
SQL Server中搜索特定的对象
2022/05/25 SQL Server