celery---一个懂得异步任务,延时任务,周期任务的芹菜(代码片段)

xinjie123 xinjie123     2022-12-19     701

关键词:

Celery是什么?

celey是芹菜

celery是基于Python实现的模块,用于执行异步延时周期任务的

其结构组成是由

  1.用户任务 app

  2.管道任务broker用于存储任务 官方推荐redis rabbitMQ /backend 用于存储任务执行结果的

  3.员工 worker

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
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

Celery的启动

根据操作系统的不同,启动方式也存在差异:
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

项目目录

在实际项目中我们应用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)
View Code

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

Celery延时任务

技术图片
 1 from Celery_task.task_one import one
 2 from Celery_task.task_two import two
 3 
 4 # one.delay(10,10)
 5 # two.delay(20,20)
 6 
 7 # 定时任务我们不在使用delay这个方法了,delay是立即交给task 去执行
 8 # 现在我们使用apply_async定时执行
 9 
10 #首先我们要先给task一个执行任务的时间
11 import datetime,time
12 # 获取当前时间 此时间为东八区时间
13 ctime = time.time()
14 # 将当前的东八区时间改为 UTC时间 注意这里一定是UTC时间,没有其他说法
15 utc_time = datetime.datetime.utcfromtimestamp(ctime)
16 # 为当前时间增加 10 秒
17 add_time = datetime.timedelta(seconds=10)
18 action_time = utc_time + add_time
19 
20 # action_time 就是当前时间未来10秒之后的时间
21 #现在我们使用apply_async定时执行
22 res = one.apply_async(args=(10,10),eta=action_time)
23 print(res.id)
24 #这样原本延迟5秒执行的One函数现在就要在10秒钟以后执行了
my_celery

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

Celery周期任务

技术图片
 1 from celery import Celery
 2 from celery.schedules import crontab
 3 
 4 celery_task = Celery("task",
 5                      broker="redis://127.0.0.1:6379",
 6                      backend="redis://127.0.0.1:6379",
 7                      include=["Celery_task.task_one","Celery_task.task_two"])
 8 
 9 #我要要对beat任务生产做一个配置,这个配置的意思就是每10秒执行一次Celery_task.task_one任务参数是(10,10)
10 celery_task.conf.beat_schedule=
11     "each10s_task":
12         "task":"Celery_task.task_one.one",
13         "schedule":10, # 每10秒钟执行一次
14         "args":(10,10)
15     ,
16     "each1m_task": 
17         "task": "Celery_task.task_one.one",
18         "schedule": crontab(minute=1), # 每一分钟执行一次
19         "args": (10, 10)
20     ,
21     "each24hours_task": 
22         "task": "Celery_task.task_one.one",
23         "schedule": crontab(hour=24), # 每24小时执行一次
24         "args": (10, 10)
25     
26 
27 
28 
29 #以上配置完成之后,还有一点非常重要
30 # 不能直接创建Worker了,因为我们要执行周期任务,所以首先要先有一个任务的生产方
31 # celery beat -A Celery_task
32 # 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?Celery是芹菜Celery是基于Python实现的模块,用于执行异步定时周期任务的其结构的组成是由   1.用户任务app   2.管道broker用于存储任务官方推荐redisrabbitMQ /backend用于存储任务执行结果的 &nbs... 查看详情

celery异步,延时任务,周期任务(代码片段)

  celery中文译为芹菜,是一个分布式任务队列. 是异步的,所以能处理大量消息  最新的celery不支持windows下使用了,所以在使用pycharm安装celery模块之后,需要再安装eventlet模块才能测试运行.一.异步任务启动客户端:s1,s2要在项... 查看详情

celery时区设置问题源码探究

参考技术A项目中有使用到Celery框架,主要使用Celery来在使用Django搭建的项目中创建延时任务及周期任务。在使用过程中出现过延时任务及周期任务到预定时间未能执行的情况。Google、百度了一些网友的分析及解决方案,大多认... 查看详情

celery(代码片段)

Celery1.Celery是什么Celery一个懂得异步任务,定时任务,周期任务的芹菜Celery是基于Python实现的模块,用于执行异步定时周期任务的其结构的组成是由   1.用户任务app   2.管道broker用于存储任务官方推荐redisrabbitMQ&n... 查看详情

celery(代码片段)

目录celery1celery简介2安装3celery的架构4celery的使用场景5celery的使用5.1基本结构+异步任务5.2包结构+延时任务5.3异步任务5.4延时任务5.5定时任务6django使用celerycelerycelery是一个异步任务框架,用于执行异步任务,执行延迟任务,执行... 查看详情

celery:celery介绍架构基本使用,celery执行异步任务延迟任务定时任务,django中使用celery。(代码片段)

一、celery介绍Celery官网:Celery-DistributedTaskQueue—Celery5.2.7documentationCelery官方文档英文版:Celery-DistributedTaskQueue—Celery5.2.7documentation#celery:芹菜,一个分布式的异步任务框架。⭐celery能干什么:异步任务,延迟任... 查看详情

celery的使用(代码片段)

一、celery介绍1.什么是celeryCelery是一个简单、灵活且可靠的,处理大量消息的分布式系统专注于实时处理的异步任务队列同时也支持任务调度celery单独使用一个socket,不会额外占用其他程序的资源。项目中使用celery的优势减少服... 查看详情

django项目中使用celery做异步任务(代码片段)

异步任务介绍在写项目过程中经常会遇到一些耗时的任务,比如:发送邮件、发送短信等等~。这些操作如果都同步执行耗时长对用户体验不友好,在这种情况下就可以把任务放在后台异步执行celery就是用于处理异步任务的框架,celery... 查看详情

celery收下这捆芹菜!(代码片段)

目录Celery简介Celery构成TaskBrokerWorkerBackendCelery使用安装基本使用异步任务:delay延迟任务:apply_async周期任务:beat_schedulesDjango配置Celerycelery.pytask.pyCelery简介Celery是一个强大的分布式任务队列的异步处理框架,它可以让任务的执行完全... 查看详情

celery介绍(代码片段)

目录官方架构:  celery是独立的服务celery包结构 celery执行异步任务,延时任务,定时任务异步任务 延时任务 定时任务 django使用celery秒杀逻辑双写一致性官方Celery官网:Celery-DistributedTaskQueue—Celery5.2.7documentati... 查看详情

celery异步任务框架(代码片段)

目录Celery架构消息中间件任务执行单元任务结果存储Celery的安装配置Celery执行异步任务使用步骤立即任务和延时任务定时任务使用场景django项目中使用celery.py(celery服务)tasks.py(任务)坑点:Celery官网:http://www.celeryproject.org/Ce... 查看详情

django中使用celery来异步处理和定时任务(代码片段)

DjangoWeb项目中我们经常需要执行耗时的任务比如发送邮件、调用第三方接口、批量处理文件等等,将这些任务异步化放在后台运行可以有效缩短请求响应时间。另外服务器上经常会有定时任务的需求,比如清除缓存、备... 查看详情

celery定时任务

参考技术ACelery是一个强大的分布式任务队列,他可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。通常用来实现异步任务和定时任务。异步任务比如发送邮件,文件上传图像处理等;定时任务就是需要在... 查看详情

关于celery的应用(代码片段)

  一、首先:以下代码都是在LINUX上执行的,因为新版本celery已经不支持windows系统,运行会报错。  Celery是处理大量消息的一个分布式系统,那他是如何运行的呢?      可以看到,Celery主要包含以下几个模块:... 查看详情

celery+rabbitmq实现异步任务

Celery+Rabbitmq实现异步任务一.安装celery,再安装rabbitmq或redispipinstallceleryrabbitmq和redis安装其中一个就可以了,celery官方文档里说用两个都可以,但优先推荐rabbitmq,具体怎么安装可以自己找一下教程.二.搭建celery任务架构在项目中适合的... 查看详情

1.10celery(代码片段)

Celery架构Celery的架构由三部分组成,消息中间件(messagebroker)、任务执行单元(worker)和任务执行结果存储(taskresultstore)组成。消息中间件Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,Ra... 查看详情

celery基本使用(代码片段)

1.认识CeleryCelery是一个基于Python开发的分布式异步消息任务队列,可以实现任务异步处理,制定定时任务等。异步消息队列:执行异步任务时,会返回一个任务ID给你,过一段时间后拿着任务ID去取执行结果定时任务:类似于Window... 查看详情

celery-一个会做异步任务,定时任务的芹菜(代码片段)

Celery分布式任务队列同步与异步比如说你要去一个餐厅吃饭,你点完菜以后假设服务员告诉你,你点的菜,要两个小时才能做完,这个时候你可以有两个选择一直在餐厅等着饭菜上桌你可以回家等着,这个时候你就可以把你的电话留给... 查看详情