在项目中使用Celery
项目 Celery 使用
2023-09-11 14:19:18 时间
项目结构
项目的结构如下
celery.py
from celery import Celery
# 创建celery实例
app = Celery('demo')
app.config_from_object('project.celeryconfig')
# 自动搜索任务
app.autodiscover_tasks(['project'])
celeryconfig.py
broker_url = 'redis://127.0.0.1:6379/5'
result_backend = 'redis://127.0.0.1:6379/6'
tasks.py
from project.celery import app as celery_app
# 创建任务函数
@celery_app.task
def my_task1():
print("任务函数(my_task1)正在执行....")
@celery_app.task
def my_task2():
print("任务函数(my_task2)正在执行....")
@celery_app.task
def my_task3():
print("任务函数(my_task3)正在执行....")
启动项目
说明
- 搜寻到的任务
- 配置信息
路由
- 当任务较多的时候我们可以指定某个队列专门处理特定的事情
- 比如一个队列处理发送邮件,一个队列处理上传文件
启动队列
我们启动两个队列Queue1
和Queue2
,进入Linux
系统,注意我们要启动两个终端,分别输入以下命令
celery -A project worker --loglevel=info -Q queue1
celery -A project worker --loglevel=info -Q queue2
- 这样我们就启动了两个队列来干活,这样相当于启动了两个
worker
服务器,一个worker
服务器负责一个队列(本次演示使用方式) - 我们还可以用一个
worker
服务器处理两个队列的事,输入以下命令
celery -A project worker --loglevel=info -Q queue1,queue2
路由配置
所谓路由配置,也就是配置哪个任务到哪个队列(什么队列干什么活)
- 打开
celeryconfig.py
文件,进行如下配置
task_routes=({
'project.tasks.my_task1': {'queue': 'queue1'},
'project.tasks.my_task2': {'queue': 'queue1'}
})
- 在项目下新建
test.py
写上如下代码
调度任务
delay
- 我们另起一个终端,可以使用
delay
来进行任务的调度 - 输入以下语句
from project.tasks import my_task1
my_task1.delay()
我们就会发现任务执行了
apply_async
使用此方法进行任务调度,可以指定队列和任务执行的延迟时间
my_task2.apply_async((),queue="queue1",countdown=10)
- 当前函数指的就是将任务发送到
queue1
队列,10s后执行
周期任务
这里会使用到
celery beat
调度器,他可以使任务周期执行,官网的相关说明,点击
普通周期任务
假设每5S执行一次任务3,那么我们可以再celeryconfig.py
文件下增加如下配置
beat_schedule = {
"every-5-seconds": {
"task": "project.tasks.my_task3",
"schedule": 5.0
}
}
启动Linux系统,输入命令
celery -A project worker --loglevel=info --beat
当我们启动之后,就会发现任务开始每隔5s自动执行了
定时周期任务
如果我们想每天或者每周的几点执行一次任务,那么这个时候就用到了cron任务,可以在celeryconfig.py
中增加如下配置信息
from celery.schedules import crontab
beat_schedule = {
"add-every-monday-morning": {
"task": "project.tasks.my_task2",
"schedule": crontab(hour=7, minute=30, day_of_week=1)
}
}
那么这里就表示的是每周一早晨7:30执行任务3
任务时间
celerybeat-schedule任务执行时间的结果保存在celerybeat-schedule
系列文件中
相关文章
- Android开发者应该深入学习的10个开源应用项目
- 【项目积累】对JSON数据的处理
- 恭喜 KubeVela 获得中国开源云联盟 2022 “优秀开源项目”
- Dragonfly 成为 CNCF 孵化项目,我们与基金会首位华人 TOC 聊了聊
- python后端面试第七部分:项目部分--长期维护
- 项目管理(二)- 规划项目
- 把gitosis-admin项目从一台机器迁移到另一台机器( git 2.30.2)
- 【OAK开源项目教程】opencv+python实现测量包装盒尺寸和体积
- Dell 1450用vs2010打开项目后,没反应
- 企业级Android音视频开发学习路线+项目实战+源码解析(WebRTC Native 源码、X264源码、FFmpeg、Opus源码.....)
- 基于Qt天气预报项目开发
- [手游新项目历程]第10天-角色登陆流程
- web开发性能优化---项目架构篇
- Jenkins自由风格软件项目构建----Jenkins+Pytest+Allure搭建自动化测试任务
- RK3399平台开发系列讲解(项目实践篇)1.1、USB 摄像头在 RK3399 上的应用
- 【Android进阶】1、Android Studio 项目搭建
- Android Studio 怎么单击项目窗口的文件在编辑器中自动打开
- 【项目实战】商城中基于MyBatis-Plus多租户功能逻辑设计
- 【项目实战】Java代码反编译工具的使用 以及 如何对Java代码进行混淆?