1.什么是Celery?
Celery 是芹菜
Celery 是基于Python实现的模块, 用于执行异步定时周期任务的
其结构的组成是由
    1.用户任务 app
    2.管道 broker 用于存储任务 官方推荐 redis rabbitMQ  / backend 用于存储任务执行结果的
    3.员工 worker

2.Celery的简单实例

 from celery import Celery
import time #创建一个Celery实例,这就是我们用户的应用app
my_task = Celery("tasks", broker="redis://127.0.0.1:6379", backend="redis://127.0.0.1:6379") # 为应用创建任务,func1
@my_task.task
def func1(x, y):
time.sleep(15)
return x + y

s1.py

 from s1 import func1

 # 将任务交给Celery的Worker执行
res = func1.delay(2,4) #返回任务ID
print(res.id)

s2.py

 from celery.result import AsyncResult
from s1 import my_task # 异步获取任务返回值
async_task = AsyncResult(id="31ec65e8-3995-4ee1-b3a8-1528400afd5a",app=my_task) # 判断异步任务是否执行成功
if async_task.successful():
#获取异步任务的返回值
result = async_task.get()
print(result)
else:
print("任务还未执行完成")

s3.py

三个文件创建完成了,细心的同学现在已经开始分析哪个文件是app,哪个文件是borker,哪个是worker了
那我们得一步一步分析了,最终我们要执行的任务是在 s1.py 中,也就是worker需要执行的任务,所以worker就是 s1.py了
现在我们就来启动worker,如何启动呢
根据操作系统的不同,启动方式也存在差异:
Linux - celery worker -A s1 -l INFO
Windows:这里需要注意的是celery 4.0 已经不再对Windows操作系统提供支持了,也就是在windows环境下出现问题除非自己解决,否贼官方是不会给你解决的
Windows - celery worker -A s1 -l INFO -P eventlet
ps: eventlet 是一个python的三方库 需要使用 pip安装 pip install eventlet

启动完成,其实在s1.py当中,worker已经知道了自己的broker 和 backend 在哪里了
接下来就让异步任务开始执行吧,对了 s2.py 中就是使用 delay 的方式来开始执行的异步任务
执行 s2.py 得到了一个字符串 55a84ea3-afa4-4ab9-8650-40e156c07441 这个字符串儿就是异步任务的ID
在Celery worker 的控制台中可以看到这个样子

等待15秒钟之后就可以的到这样一个字符串

然后通过s3.py修改异步任务的ID来获取任务返回的结果

这样就简单完成了一个Celery异步任务了

3.Celery 结合 Flask 模拟"抢购"系统

https://pan.baidu.com/s/15T08QUBYWqi8QjE0sPUBlg

下载源码查看示例

4.Celery项目目录

在实际项目中我们应用Celery是有规则的

要满足这样的条件才可以哦,目录Celery_task这个名字可以随意起,但是一定要注意在这个目录下一定要有一个celery.py这个文件

 from celery import Celery

 celery_task = Celery("task",
broker="redis://127.0.0.1:6379",
backend="redis://127.0.0.1:6379",
include=["Celery_task.task_one","Celery_task.task_two"])
# include 这个参数适用于寻找目录中所有的task

celery.py

 from .celery import celery_task
import time @celery_task.task
def one(x,y):
time.sleep(5)
return f"task_one {x+y}"

task_one

 from .celery import celery_task
import time @celery_task.task
def two(x,y):
time.sleep(5)
return f"task_two {x+y}"

task_two

这样Celery项目目录结构就已经做好了然后再 my_celery中调用

 from Celery_task.task_one import one
from Celery_task.task_two import two one.delay(10,10)
two.delay(20,20)

my_celery.py

PS:启动Worker的时候无需再使用文件启动,直接启动你的Celery_task目录就行了
celery worker -A Celery_task -l INFO -P eventlet
这样celery就可以自动的去检索当前目录下所有的task了,通过Include这个参数逐一去寻找

5.Celery定时任务
我们还使用Celery_task这个示例来修改一下
my_celery中进行一下小修改

 from Celery_task.task_one import one
from Celery_task.task_two import two # one.delay(10,10)
# two.delay(20,20) # 定时任务我们不在使用delay这个方法了,delay是立即交给task 去执行
# 现在我们使用apply_async定时执行 #首先我们要先给task一个执行任务的时间
import datetime,time
# 获取当前时间 此时间为东八区时间
ctime = time.time()
# 将当前的东八区时间改为 UTC时间 注意这里一定是UTC时间,没有其他说法
utc_time = datetime.datetime.utcfromtimestamp(ctime)
# 为当前时间增加 10 秒
add_time = datetime.timedelta(seconds=10)
action_time = utc_time + add_time # action_time 就是当前时间未来10秒之后的时间
#现在我们使用apply_async定时执行
res = one.apply_async(args=(10,10),eta=action_time)
print(res.id)
#这样原本延迟5秒执行的One函数现在就要在10秒钟以后执行了

my_celery

定时任务只能被执行一次,那如果我想每隔10秒都去执行一次这个任务怎么办呢? 周期任务来了

6.Celery周期任务

首先要对Celery_task中的celery.py进行一点修改:

 from celery import Celery
from celery.schedules import crontab celery_task = Celery("task",
broker="redis://127.0.0.1:6379",
backend="redis://127.0.0.1:6379",
include=["Celery_task.task_one","Celery_task.task_two"]) #我要要对beat任务生产做一个配置,这个配置的意思就是每10秒执行一次Celery_task.task_one任务参数是(10,10)
celery_task.conf.beat_schedule={
"each10s_task":{
"task":"Celery_task.task_one.one",
"schedule":10, # 每10秒钟执行一次
"args":(10,10)
},
"each1m_task": {
"task": "Celery_task.task_one.one",
"schedule": crontab(minute=1), # 每一分钟执行一次
"args": (10, 10)
},
"each24hours_task": {
"task": "Celery_task.task_one.one",
"schedule": crontab(hour=24), # 每24小时执行一次
"args": (10, 10)
} } #以上配置完成之后,还有一点非常重要
# 不能直接创建Worker了,因为我们要执行周期任务,所以首先要先有一个任务的生产方
# celery beat -A Celery_task
# celery worker -A Celery_task -l INFO -P eventlet

celery.py

创建Worker的方式并没有发行变化,但是这里要注意的是,每间隔一定时间后需要生产出来任务给Worker去执行,这里需要一个生产者beat

celery beat -A Celery_task  #创建生产者 beat 你的 schedule 写在哪里,就要从哪里启动

celery worker -A Celery_task -l INFO -P eventlet

创建worker之后,每10秒就会由beat创建一个任务给Worker去执行

到此为止 Celery的应用就已经完事儿了,Bye

Celery - 异步任务 , 定时任务 , 周期任务的更多相关文章

  1. Celery 异步任务 , 定时任务 , 周期任务 的芹菜

    1.什么是Celery?Celery 是芹菜Celery 是基于Python实现的模块, 用于执行异步定时周期任务的其结构的组成是由    1.用户任务 app    2.管道 broker 用于存储 ...

  2. Celery - 一个懂得 异步任务 , 定时任务 , 周期任务 的芹菜

    1.什么是Celery?Celery 是芹菜Celery 是基于Python实现的模块, 用于执行异步定时周期任务的其结构的组成是由    1.用户任务 app    2.管道 broker 用于存储 ...

  3. celery(芹菜) 异步任务 定时任务 周期任务

    什么是celery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 celery架构 celery的架构由三部分组成,消息中间件(me ...

  4. celery异步任务 定时任务

    以前项目中用到过 celery ,但是没怎么记笔记,现在在记一下,方便以后用.   Celery.png 问:Celery 是什么? 答:Celery 是一个由 Python 编写的简单.灵活.可靠的 ...

  5. django —— Celery实现异步和定时任务

    1. 环境 python==2.7 djang==1.11.2 # 1.8, 1.9, 1.10应该都没问题 celery-with-redis==3.0 # 需要用到redis作为中间人服务(Bro ...

  6. Celery+python+redis异步执行定时任务

    我之前的一篇文章中写了[Celery+django+redis异步执行任务] 博文:http://blog.csdn.net/apple9005/article/details/54236212 你会 ...

  7. celery异步任务、定时任务

    阅读目录 一 什么是Celery? 二 Celery的使用场景 三 Celery的安装配置 四 Celery异步任务 五Celery定时任务 六在Django中使用Celery   一 什么是Cele ...

  8. 日夕如是寒暑不间,基于Python3+Tornado6+APScheduler/Celery打造并发异步动态定时任务轮询服务

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_220 定时任务的典型落地场景在各行业中都很普遍,比如支付系统中,支付过程中因为网络或者其他因素导致出现掉单.卡单的情况,账单变成了 ...

  9. celery异步任务框架

    目录 Celery 一.官方 二.Celery异步任务框架 Celery架构图 消息中间件 任务执行单元 任务结果存储 三.使用场景 四.Celery的安装配置 五.两种celery任务结构:提倡用包 ...

随机推荐

  1. 报错 DOMDocument not found

    php -m 查看有没有dom扩展 没有安装扩展 yum install php-dom php 常用扩展有 yum install php-solr php-opcache php-seasLog ...

  2. Redis探索之路(四):Redis的五种数据类型Set和ZSet

    一:Set无需集合 Set是个集合,string类型的无需集合,通过hash table实现,添加删除查找复杂度都是0(1).对集合我们可以取并集,交集和差集.通过这些操作我们可以实现sns中的好友推 ...

  3. 本地仓库_remote.repositories(拒绝访问)

    问题描述: 通过阿里云配置本地的 Maven 仓库,使用 Maven 命令在进行打包.编译等一系列操作时候,总是出现提示某个 Jar 文件 ---> 『.....\ _remote.reposi ...

  4. delphi JPG转为BMP存入数据库

    delphi  JPG转为BMP存入数据库   必须在uses中引用JPEG procedure TForm1.BitBtn3Click(Sender: TObject);varjpg:TJPEGim ...

  5. MaxCompute 表(Table)设计规范

    表的限制项 表(Table)设计规范 表设计主要目标 表设计的影响 表设计步骤 表数据存储规范 按数据分层规范数据生命周期 按数据的变更和历史规范数据的保存 数据导入通道与表设计 分区设计与逻辑存储的 ...

  6. 查看hadoop压缩方式

    bin/hadoop checknative  来查看我们编译之后的hadoop支持的各种压缩,如果出现openssl为false,那么就在线安装一下依赖包 bin/hadoop checknativ ...

  7. golang的select典型用法

    golang 的 select 的功能和 select, poll, epoll 相似, 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作. 示例: ch1 := make (chan in ...

  8. 笔试题-求小于等于N的数中有多少组素勾股数

    题目描述: 一组勾股数满足:a2+b2=c2: 素勾股数:a,b,c彼此互质. 输入正整数N: 输出小于等于N的数中有多少组勾股数. 例: 输入:10 输出:1 思路:我是直接暴力破解的…… 首先找出 ...

  9. [转]设置修改CentOS系统时区

    在我们使用CentOS系统的时候,也许时区经常会出现问题,有时候改完之后还是会出错,下面我们就来学习一种方法来改变这个状况.如果没有安装,而你使用的是 CentOS系统 那使用命令 yum insta ...

  10. hexo next主题深度优化(九),给博客加入主题,护眼主题,护眼色。

    文章目录 背景 效果 码 _layout.swig custom.styl eye.js 引用eye.js 直接引用 main.js pjax的函数中重写 个人博客:https://mmmmmm.me ...