这个翻译之后居然叫芹菜~~最近Django框架需要涉及到执行周期任务~~上网搜了下其实还挺多的(django_crontab:这个学习周期短,但是发现不仅麻烦还不好用啊)、(apscheduler,简单还行在没完全掌握Celery时先用它顶了一段时间,但是需要注意不同版本的使用方法差别还挺大的),最后还是决定花时间来学学,Celery是Python语言实现的分布式队列服务,除了支持即时任务,还支持定时任务。

Celery中的五个核心角色

  • Task

  任务(Task)就是你要做的事情,例如一个注册流程里面有很多任务,给用户发验证邮件就是一个任务,这种耗时任务可以交给Celery去处理,还有一种任务是定时任务,比如每天定时统计网站的注册人数,这个也可以交给Celery周期性的处理。

  • Broker

  Broker 的中文意思是经纪人,指为市场上买卖双方提供中介服务的人。在Celery中它介于生产者和消费者之间经纪人,这个角色相当于数据结构中的队列。例如一个Web系统中,生产者是处理核心业务的Web程序,业务中可能会产生一些耗时的任务,比如短信,生产者会将任务发送给 Broker,就是把这个任务暂时放到队列中,等待消费者来处理。消费者是 Worker,是专门用于执行任务的后台服务。Worker 将实时监控队列中是否有新的任务,如果有就拿出来进行处理。Celery 本身不提供队列服务,一般用 Redis 或者 RabbitMQ 来扮演 Broker 的角色

  • Worker

  Worker 就是那个一直在后台执行任务的人,也称为任务的消费者,它会实时地监控队列中有没有任务,如果有就立即取出来执行。

  • Beat

  Beat 是一个定时任务调度器,它会根据配置定时将任务发送给 Broker,等待 Worker 来消费。

  • Backend

  Backend 用于保存任务的执行结果,每个任务都有返回值,比如发送邮件的服务会告诉我们有没有发送成功,这个结果就是存在Backend中,当然我们并不总是要关心任务的执行结果。

入门操作

1、安装(Celery4.x 开始不再支持Windows平台,如果需要在Windows开发,请使用3.x的版本)

pip install celery==3.1.15

2、创建一个实例

# 创建一个Celery实例,broker是管道用于储存任务,官方推荐Redis、RabbitMQ;backend用于存储任务执行结果
app = Celery("tasks", broker="redis://127.0.0.1:6379", backend='redis://127.0.0.1:6379')

3、直接上代码(新建一个celery_task1目录,里面建下面两个py文件)

#!/usr/bin/env python3
# -*- encoding:utf-8 -*-
"""
author:Barret
mail:barret_vip@163.com
"""
from celery import Celery
import time # 创建Celery实例
app = Celery('tasks', broker='redis://127.0.0.1:6379',
backend='redis://127.0.0.1:6379',
)
app.conf.task_protocol = 1 # 创建任务
@app.task
def add(x):
time.sleep(1)
print("开始任务了:%s" %x)
return x

celerys.py

#!/usr/bin/env python3
# -*- encoding:utf-8 -*-
"""
author:Barret
mail:barret_vip@163.com
"""
from celery.result import AsyncResult
import sys dir = r"D:\today\celery_task1"
sys.path.append(dir) # 我的任务文件不在环境变量里,IDLE找不到
from celerys import add
reslut = add.delay(1) # 判断是否有值,get调用会阻塞
print(reslut) # 可以查看id,也可以使用reslut.id获取id。 # 异步获取任务返回值
async_task = AsyncResult(id="45cf4a22-82d5-43f2-a0c9-8fd3af6b1136", app=add) # 判断异步任务是否执行成功
if async_task.successful():
r = reslut.get(propagate=False) # 出现异常返回异常不触发异常
print(r)
else:
print("任务还没执行完毕")

cmd

4、执行步骤(不建议直接在Django项目中创建,会出现报错)

# 1、打开CMD或者Pycharm下的Terminal执行下面命令:
celery -A celerys worker -l info -P eventlet # 2、接着运行cmd.py即可打印结果

结果出现这样的即运行成功:

入门操作报错

  • BUG1:如果出现:AttributeError: 'str' object has no attribute 'items',则是redis版本过高(我安装的是3.x),安装2.10.6即可~(但是在我安装2.10之后又说我版本太低,但是当我重新装回3.x的时候又能用了~~~我只能说玄学好吧)

  • BUG_2:如果出现下面这个报错解决办法是,在实例化Celery时添加下面配置项,这个好像是新协议问题,使用指定到旧协议。

# 在app创建的时候指定
CELERY_TASK_PROTOCOL = 1 # Django中使用这个
app.conf.task_protocol = 1

BUG_2:解决办法

  • BUG_3:如果想获取返回结果直接用get方式会报错,需要指定保存任务结果的位置。
reslut.get()  # 会报错这里是实例化的时候,没有定义backend,就是保存任务结果的位置。

  • BUG_3解决:指定输出到,我这里还是指定到redis中。

好吧我算是把各种报错都玩了个遍~~~~

  • BUG_4:在执行时又出现下面这个报错了
Traceback (most recent call last):
File "d:\programmingsoftware\python35\lib\site-packages\billiard\pool.py", line 358, in workloop
result = (True, prepare_result(fun(*args, **kwargs)))
File "d:\programmingsoftware\python35\lib\site-packages\celery\app\trace.py", line 525, in _fast_trace_task
tasks, accept, hostname = _loc
ValueError: not enough values to unpack (expected 3, got 0)
pip install eventlet # 安装一下
celery -A task1 worker -l info -P eventlet # 将启动命令改成这个
再去执行cmd.py就没问题了~~

BUG_4:解决方法

  • 哇~~~~想哭一波三折终于看到输出了(这一步就代表初步使用没问题了,接下来我终于可以做周期任务了)

在Django中使用Celery

更新中..................

Celery实现周期任务的更多相关文章

  1. Celery异步任务队列/周期任务+ RabbitMQ + Django

    一.Celery介绍和基本使用  Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celer ...

  2. Celery(异步任务,定时任务,周期任务)

    1.什么是Celery Celery是基于Python实现的模块,用于异步.定时.周期任务的. 组成结构: 1.用户任务 app 2.管道broker 用于存储任务 官方推荐 redis/rabbit ...

  3. Celery(四)定时任务

    要定时或者周期性的执行任务,可以使用linux的crontab.Celery也提供了类似的Periodic Tasks功能. Celery beat Celery使用celery beat作为任务调度 ...

  4. Celery工具

    什么是Celery Celery的功能 Celery是基于python实现的第三方组件,可以实现定时任务.周期任务等. Celery的组成 Celery的角色 - 任务,创建或发布任务. - 使用re ...

  5. 分布式队列神器 Celery

    Celery 是什么? Celery 是一个由 Python 编写的简单.灵活.可靠的用来处理大量信息的分布式系统,它同时提供操作和维护分布式系统所需的工具. Celery 专注于实时任务处理,支持任 ...

  6. Celery ---- 分布式队列神器 ---- 入门

    原文:http://python.jobbole.com/87238/ 参考:https://zhuanlan.zhihu.com/p/22304455 Celery 是什么? Celery 是一个由 ...

  7. django+celery 实现定时任务

    利用 celery 实现定时任务 celery支持定时任务,设定好任务的执行时间,celery就会定时自动帮你执行, 这个定时任务模块叫celery beat Celery安装 由于celery 4. ...

  8. 分布式队列Celery

    Celery是什么? Celery 是一个由 Python 编写的简单.灵活.可靠的用来处理大量信息的分布式系统,它同时提供操作和维护分布式系统所需的工具. Celery 专注于实时任务处理,支持任务 ...

  9. 分布式任务队列 Celery —— 应用基础

    目录 目录 前文列表 前言 Celery 的周期定时任务 Celery 的同步调用 Celery 结果储存 Celery 的监控 Celery 的调试 前文列表 分布式任务队列 Celery 分布式任 ...

随机推荐

  1. 走近源码:Redis如何清除过期key

    "叮--",美好的周六就这么被一阵钉钉消息吵醒了. 业务组的同学告诉我说很多用户的帐号今天被强制下线.我们的帐号系统正常的逻辑是用户登录一次后,token的有效期可以维持一天的时间 ...

  2. Serpent.AI - 游戏代理框架(Python)

    Serpent.AI - 游戏代理框架(Python) Serpent.AI是一个简单而强大的新颖框架,可帮助开发人员创建游戏代理.将您拥有的任何视频游戏变成一个成熟的实验的沙箱环境,所有这些都是熟悉 ...

  3. 扩展KMP(记录学习过程)

    首先看了几篇博客,发现还得耐下心来理解,动手画图 ,才能理解俩字符串还有数组之间神奇的关系 这篇博客图不错:https://segmentfault.com/a/1190000008663857 /* ...

  4. coding++:Java 获取request中的参数

    第一种: private Map<String,Object> mapParameters(HttpServletRequest request) { //封装查询条件参数 Map< ...

  5. Cplex教育版申请

    任何人:直接在公众号"毒书 彼记" ,“资源下载” 板块下载: 如果你的学校没有购买cplex软件没那么,你就不可以下载教育版的cplex软件,如过下载免费板,它的功能会有一些限制 ...

  6. python 开发工具简介

    一.python 开发工具简介 1.IDLE IDLE是开发python程序的基本IDE(集成开发环境),具备基本的IDE的功能,是非商业Python开发的不错的选择.当安装好python以后,IDL ...

  7. Shell 命令 之linux 模式下的编程语言

    今天简单介绍一下shell 命令的使用,希望对大家有所帮助!!! 一. 1.首先创建一个文本 在终端 touch test.sh 用gedit test.sh 打开.sh 文件 输入如下,第一行是申明 ...

  8. 白话web安全

    伤心往事 梦回大二,那时候沉迷于毒奶粉,甚至国庆都在宿舍与毒奶粉共同度过,但是却发生了一件让我迄今难忘的事情~ 我新练的黑暗武士被盗了!!!干干净净!!! 虽然过了好久了,但是记忆犹新啊,仿佛发生在昨 ...

  9. 360网络安全学习笔记——SQLmap

    SQLmap简介 SQLmap是一个开源的自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞. SQL注入模式 1.基于布尔的盲注 2.基于时间的盲注 3.基于报错注入 ...

  10. fiddler详解

    一.介绍Fiddler是一个http协议调试工具,能记录并检查电脑和互联网之间的http通讯,设置断点,查看所有的“进出”fiddler的数据(cookie,html,js,css等文件) 通常可从以 ...