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 相关文章推荐
Python3实现的腾讯微博自动发帖小工具
Nov 11 Python
python通过shutil实现快速文件复制的方法
Mar 14 Python
Python3.2中的字符串函数学习总结
Apr 23 Python
python实现人民币大写转换
Jun 20 Python
Python IDLE清空窗口的实例
Jun 25 Python
使用python将时间转换为指定的格式方法
Nov 12 Python
python hash每次调用结果不同的原因
Nov 21 Python
Python对称的二叉树多种思路实现方法
Feb 28 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
Apr 08 Python
详解Django配置JWT认证方式
May 09 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
Aug 03 Python
python打包多类型文件的操作方法
Sep 21 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 substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
2014/12/16 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
JavaScript类和继承 prototype属性
2010/09/03 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
Angular的$http的ajax的请求操作(推荐)
2017/01/10 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
JS库之Waypoints的用法详解
2017/09/13 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
Vue export import 导入导出的多种方式与区别介绍
2020/02/12 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
跟老齐学Python之有点简约的元组
2014/09/24 Python
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
python脚本监控Tomcat服务器的方法
2018/07/06 Python
详解python中init方法和随机数方法
2019/03/13 Python
python词云库wordCloud使用方法详解(解决中文乱码)
2020/02/17 Python
Python如何在单元测试中给对象打补丁
2020/08/03 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
python定义具名元组实例操作
2021/02/28 Python
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
电子商务专业个人的自我评价
2013/11/19 职场文书
党校培训自我鉴定
2014/02/01 职场文书
机关搬迁方案
2014/05/18 职场文书
消防安全宣传标语
2014/06/07 职场文书
党员教师个人对照检查材料范文
2014/09/25 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
个人总结与自我评价
2015/02/14 职场文书
学校运动会开幕词
2016/03/03 职场文书
离婚协议书范文2016
2016/03/18 职场文书
Java生成读取条形码和二维码的简单示例
2021/07/09 Java/Android