这个翻译之后居然叫芹菜~~最近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. 数学-概率-New 21 Game

    2020-02-10 13:24:26 问题描述: 问题求解: 第一次看到这个题目的时候想到的是之前做过的一条概率题,就是那个国际象棋,那条题目的做法是使用dp去对所有留在棋盘的种类进行计数,然后除以 ...

  2. 基本的访问控制列表ACL配置

    摘要: 访问控制列表ACL (Access Control L ist)是由permit或 deny语句组成的一系列有顺序的规则集合,这些规则根据数据包的源地址.目的地址.源端口.目的端口等信息  来 ...

  3. 递归回溯法求N皇后问题

    问题描述:在一个NN(比如44)的方格中,在每一列中放置一个皇后,要求放置的皇后不在同一行,同一列,同一斜线上,求一共有多少种放置方法,输出放置的数组. 思路解析:从(1,1)开始,一列一列的放置皇后 ...

  4. 在linux系统把node安装到全局 简单记录

    1.在 根目录下建立 mysoft( 找一个放node 包) 2. 下载nodejs Linux版本(二进制),注意本教程是.tar.xz格式的. wget https://nodejs.org/di ...

  5. Oracle时间日期计算--计算某一日期为一年中的第几周

    Oracle时间日期计算--计算某一日期为一年中的第几周 select to_char(sysdate-10,'yyyymmdd')||':iw:'||to_char(sysdate-10,'iw') ...

  6. 使用Keras构建深度图像搜索引擎

    动机 想象一下,如果有数十万到数百万张图像的数据集,却没有描述每张图像内容的元数据.我们如何建立一个系统,能够找到这些图像的子集来更好地回答用户的搜索查询? 我们基本上需要的是一个搜索引擎,它能够根据 ...

  7. coding++:快速构建 kindeditor 富文本编辑器(一)

    此案例 demo 为 SpringBoot 开发 1.官网下载相关资源包:http://kindeditor.net/down.php 2.编写页面(引入相关JS) <!DOCTYPE html ...

  8. java面试基础篇-List

    一.ArrayList: 底层为数组实现,线程不安全,查询,修改快,增加删除慢, 数据结构:数组以0为下标依次连续进行存储 数组查询元素:根据下标查询就行 数组增加元素:如果需要给index为10的位 ...

  9. L - Subway(最短路spfa)

    L - Subway(最短路spfa) You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. In ...

  10. PTA | 1056 组合数的和 (15分)

    给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字.要求所有可能组合出来的 2 位数字的和.例如给定 2.5.8,则可以组合出:25.28.52.58.82.85 ...