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捕捉和模拟鼠标事件的方法
Jun 03 Python
基于Python如何使用AIML搭建聊天机器人
Jan 27 Python
深入理解NumPy简明教程---数组1
Dec 17 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
高效测试用例组织算法pairwise之Python实现方法
Jul 19 Python
python实现机械分词之逆向最大匹配算法代码示例
Dec 13 Python
Django如何防止定时任务并发浅析
May 14 Python
python binascii 进制转换实例
Jun 12 Python
python logging.basicConfig不生效的原因及解决
Feb 20 Python
浅谈django 重载str 方法
May 19 Python
Numpy中ndim、shape、dtype、astype的用法详解
Jun 14 Python
Python 中数组和数字相乘时的注意事项说明
May 10 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的memcached客户端memcached
2011/06/14 PHP
php读取EXCEL文件 php excelreader读取excel文件
2012/12/06 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
thinkphp中的url跳转用法分析
2016/07/12 PHP
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
jquery 表单进行客户端验证demo
2009/08/24 Javascript
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
分享27个jQuery 表单插件集合推荐
2011/04/25 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
javascript实现分栏显示小技巧附图
2014/10/13 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
2015/03/24 Javascript
jquery图片切换实例分析
2015/04/15 Javascript
Bootstrap基本插件学习笔记之折叠(22)
2016/12/08 Javascript
element vue Array数组和Map对象的添加与删除操作
2018/11/14 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
通过js给网页加上水印背景实例
2019/06/17 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
Python 中的lambda函数介绍
2018/10/10 Python
pytorch制作自己的LMDB数据操作示例
2019/12/18 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
django 模版关闭转义方式
2020/05/14 Python
详解vscode实现远程linux服务器上Python开发
2020/11/10 Python
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
学院领导推荐信
2013/10/30 职场文书
材料采购员岗位职责
2013/12/17 职场文书
小学教师节活动方案
2014/01/31 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
工程负责人任命书
2014/06/06 职场文书
单位计划生育责任书
2015/05/09 职场文书
招商银行工作证明
2015/06/17 职场文书
旅游安全责任协议书
2016/03/22 职场文书
2019年教师节:送给所有老师的祝福语
2019/09/05 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
Python实现列表拼接和去重的三种方式
2021/07/02 Python
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技