django 异步任务实现及Celery beat实现定时/轮询任务
Celery定时任务
requirements
celery==3.1.25 异步任务
django-celery==3.2.2 定时任务管理包
redis==2.10.6
django-redis-cache==1.7.1 方便配置Redis缓存
配置
1、工程主APP下的__init__.py文件里添加:
from .celery import app as celery_app __all__ = ['celery_app']
2、工程主APP新建个celery.py文件:
from __future__ import absolute_import
import os
from celery import Celery # set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dts.settings') from django.conf import settings # noqa app = Celery('dts') # Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) @app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
启用Celery的定时任务需要设置CELERYBEAT_SCHEDULE 。
说明:
CELERY_RESULT_SERIALIZER = 'json'为了避免错误:# Refusing to deserialize untrusted content of type pickle (application/x-python-serialize)
CELERY_RESULT_BACKEND: 就是把异步任务放到指定地方,方便后续操作。比如后续取出任务判断是否完成
Celery的定时任务都由celery beat来进行调度。celery beat默认按照settings.py之中的时区时间来调度定时任务。
创建定时任务
一种创建定时任务的方式是配置CELERYBEAT_SCHEDULE:
#每30秒调用task.add
from datetime import timedelta
from celery.schedules import crontab #为了避免该行报错,在该文件添加绝对包含、from __future__ import absolute_import
CELERYBEAT_SCHEDULE = { 'add-every-30-seconds': { 'task': 'tasks.add', 'schedule': timedelta(seconds=30), 'args': (16, 16) },
'sys_check_unpaid': {
'task': 'dashboard.tasks.mdata_schedule',
'schedule': crontab(minute=0, hour=8, day_of_month=11),
},
}
#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如下:
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的时候就能当做条件把过期的任务找到并且删除。
django 异步任务实现及Celery beat实现定时/轮询任务的更多相关文章
- Celery beat实现定时/轮询任务
Celery定时任务 配置 启用Celery的定时任务需要设置CELERYBEAT_SCHEDULE . Celery的定时任务都由celery beat来进行调度.celery beat默认按照s ...
- Django 异步任务、定时任务Celery
将任务分配给其他的进程去运行,django的主进程只负责发起任务,而执行任务的不在使用django的主进程.Python有一个很棒的异步任务框架,叫做celery. Django为了让开发者开发更加方 ...
- 日夕如是寒暑不间,基于Python3+Tornado6+APScheduler/Celery打造并发异步动态定时任务轮询服务
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_220 定时任务的典型落地场景在各行业中都很普遍,比如支付系统中,支付过程中因为网络或者其他因素导致出现掉单.卡单的情况,账单变成了 ...
- 浅谈JS异步轮询和单线程机制
单线程特点执行异步操作 js是单线程语言,浏览器只分配给js一个主线程,用来执行任务(函数),但一次只能执行一个任务,这些任务就会排队形成一个任务队列排队等候执行.一般而已,相对耗时的操作是要通过异步 ...
- Django异步任务之Celery
Celery celery 是一个用于实现异步任务的库, 在很多项目中都使用它, 它和 django 融合使用很完美. 使用 celery 可以在实现 http request请求返回 view 前做 ...
- 异步任务分发模块Celery
Celery简介 Celery是一个功能完备即插即用的任务队列.它使得我们不需要考虑复杂的问题,使用非常简单. celery适用异步处理问题,当遇到发送邮件.或者文件上传, 图像处理等等一些比较耗时的 ...
- [python基础] celery beat/task/flower解析
一.Celery 介绍 Celery 是一个强大的分布式任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务( async task )和定时任务( ...
- celery beat之pidfile already exists问题
背景 在进行celery定时任务测试时,发现到点任务并未执行,检查了log发现在启动celery beat的时候有这样一个报错,所以celery beat并未启动成功. 1234 (hzinfo) E ...
- STM32学习笔记(五) USART异步串行口输入输出(轮询模式)
学习是一个简单的过程,只要有善于发掘的眼睛,总能学到新知识,然而如何坚持不懈的学习却很困难,对我亦如此,生活中有太多的诱惑,最后只想说一句勿忘初心.闲话不多扯,本篇讲诉的是异步串行口的输入输出,串口在 ...
随机推荐
- NodeJS中的循环陷阱
Node.js的异步机制由事件和回调函数实现,一開始接触可能会感觉违反常规,但习惯以后就会发现还是非常easy的. 然而这之中事实上暗藏不少陷阱.一个非常easy遇到的问题就是回到循环的回调函数. e ...
- 斯坦福《机器学习》Lesson5感想———1、成学习算法
在前面几课里的学习算法的思路都是给定数据集以后.确定基于此数据集的最佳如果H函数,通过学习算法确定最佳如果H的各个參数,然后通过最佳如果函数H得出新的数据集的结果.在这一课里介绍了一种新的思路,它的核 ...
- 【OpenGL 学习笔记01】HelloWorld演示样例
<<OpenGL Programming Guide>>这本书是看了忘,忘了又看,赶脚还是把笔记做一做心里比較踏实,哈哈. 我的主题是,好记性不如烂笔头. ========== ...
- python——super()
一.问题的发现与提出 在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: class A: def __init__(self): pr ...
- CentOS 安装rz和sz
在虚机装了CentOS6.4版本,结果ssh上去后发现rz命令不能用.那只有自力更生了,其实很简单,如下: yum install lrzsz 如果本地没有包,需要编译安装了: cd /tmp wge ...
- window 服务(二)
接Window服务(一) ServiceController方法调用 public partial class Service1 : ServiceBase { public Service1() { ...
- Lua学习十----------Lua数组
© 版权声明:本文为博主原创文章,转载请注明出处 1.LUA数组 - 一维数组 - 多维数组 2.array.lua -- 一维数组 print("一维数组") array1 = ...
- YUV Player
https://github.com/Yonsm/RawPlayer RawPlayer https://github.com/latelee/YUVPlayer YUVPlayer https:// ...
- [码海拾贝 之Perl]在字符串数组中查找特定的字符串是否存在
前言 检索一个字符串是否存在于一个数组中, 最主要的想法应该就是对数组进行循环, 逐个推断数组的每一个元素值和给定的值是否相等. (在Java语言还能够把数组转成 List , 在 list 中直接有 ...
- unity开发android游戏(一)搭建Unity安卓开发环境
unity开发android游戏(一)搭建Unity安卓开发环境 分类: Unity2014-03-23 16:14 5626人阅读 评论(2) 收藏 举报 unity开发androidunity安卓 ...