这个翻译之后居然叫芹菜~~最近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. LeetCode45——从搜索算法推导到贪心

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode系列的第25篇文章,今天我们一起来看的是LeetCode的第45题,Jump Game II. 有同学后台留言问我说, ...

  2. js利用cookie登录网站

    如上图,我们获取到了cookie,接下来利用cookie登录相应的网站. 我用的浏览器是火狐,首先在特定的网站(也就是我们发现XSS漏洞的网站,这里指的是pikachu)F12打开开发者工具,找到控制 ...

  3. OpenCV-Python 轮廓特征 | 二十二

    目标 在本文中,我们将学习 如何找到轮廓的不同特征,例如面积,周长,质心,边界框等. 您将看到大量与轮廓有关的功能. 1. 特征矩 特征矩可以帮助您计算一些特征,例如物体的质心,物体的面积等.请查看特 ...

  4. TensorFlow 实战卷积神经网络之 LeNet

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! LeNet 项目简介 1994 年深度学习三巨头之一的 Yan L ...

  5. 045.集群存储-CSI存储机制

    一 CSI存储机制 1.1 CSI简介 Kubernetes从1.9版本开始引入容器存储接口Container Storage Interface(CSI)机制,用于在Kubernetes和外部存储系 ...

  6. C++最简打开网页的方法

    system("explorer https://pay.747fz.com");

  7. flask中温柔显示404等错误

    写下下面两个视图函数,然后在模板中写下错误时展现的内容,当然模板名,函数名是可以改的哟@app.errorhandler(404)def page_not_found(error): return r ...

  8. Netty耗时的业务逻辑应该写在哪儿,有什么注意事项?

    更多技术分享可关注我 前言 Netty以高性能著称,但是在实际使用中,不可避免会遇到耗时的业务逻辑,那么这些耗时操作应该写在哪儿呢,有什么注意的坑吗?本篇文章将一一总结. Netty线程调度模型回顾 ...

  9. MATLAB 动图绘制、保存

    动图有gif格式和视频的avi格式. 1.sin(x)动图 clear all h = animatedline;%动画线 axis([0 4*pi -1 1]) box on x = linspac ...

  10. k8s + docker + Jenkins使用Pipeline部署SpringBoot项目时Jenkins错误集锦

    背景 系统版本:CentOS7 Jenkins版本:2.222.1 maven版本:apache-maven-3.6.3 Java版本:jdk1.8.0_231 Git版本:1.8.3.1 docke ...