Celery的基本使用

news2024/9/25 17:20:22

1.Celery介绍

1.1 Celery是什么?

  • Celery是Python开发的简单、灵活可靠的、处理大量消息的分布式任务调度模块
  • 专注于实时处理的异步任务队列
  • 同时也支持任务调度

Celery本身不含消息服务,它使用第三方消息服务来传递任务,目前,Celery支持的消息服务有RabbitMQ、Redis、Amazon SQS;Celery 是用 Python 编写的,但协议可以用任何语言实现。除了 Python 语言实现之外,还有Node.js的 node-celery 和php的 celery-php 。

需要注意的是:

Celery is a project with minimal funding, so we don’t support Microsoft Windows. Please don’t open any issues related to that platform.

大概意思就是Celery 是一个资金最少的项目,因此我们不支持 Microsoft Windows,请不要提出与该平台相关的任何问题。官方不支持windows,可以通过插件eventlet在windows中使用,功能有部分缩减。

1.2 架构图

Celery的架构由三部分组成,消息中间件(message broker)、任务执行单元(worker)和 任务执行结果存储(task result store)组成。

启动celery服务(配置好broker和backend),手动或自动添加任务到broker中,broker将任务分发给worker,worker后台异步执行任务,执行完成后将结果存放到backend中。
在这里插入图片描述

2.安装

2.1 linux安装

通过pip安装

# 本机Python环境为Python3.7.4
pip install celery

# 验证安装 查看版本
celery --version

---console---
5.2.3 (dawn-chorus)

使用redis作为backend和broker,需要本机安装redis,并启动redis-server,还需要安装Python第三方模块redis

pip install redis

2.2 windows安装

由于官方不支持windows安装和使用,需要借助Python第三方模块eventlet,此模块主要作用通过协程实现并发。

pip install celery
pip install eventlet

# 验证安装 查看版本
celery --version

---console---
5.2.3 (dawn-chorus)

3.基本使用

目录结构
celery对目录要求严格,如果不在目录下加入__init__.py,worker执行任务可能会出现NotRegistered的情况

demo1
	- __init__.py
	- tasks.py
	- run.py

tasks.py

from celery import Celery

# 通过使用本机redis且没有密码,使用远程redis有密码格式为
# 'redis://:密码@ip:6379/1'
broker = 'redis://127.0.0.1:6379/1'  # 任务储存
backend = 'redis://127.0.0.1:6379/2'  # 结果存储,执行完之后结果放在这

# 创建出app对象
app = Celery(__name__, broker=broker, backend=backend)

# 任务通过装饰器@app.task进行装饰
@app.task
def add(x, y):
    return x + y

run.py

from tasks import add

# 添加任务

# 返回一个 AsyncResult 实例,可以用于进行跟踪任务状况
result = add.delay(3,4)
print(result)

3.1 启动worker

# 需要cd到tasks文件对应的路径
# 启动一个worker,日志打印级别为info

# windows平台启动
# celery -A tasks worker -l info -P eventlet
# linux启动
# 格式为:celery -A app对象所在的文件 worker -l 日志级别
celery -A tasks worker -l info

---console---
/usr/local/lib/python3.7/site-packages/celery/platforms.py:841: SecurityWarning: You're running the worker with superuser privileges: this is
absolutely not recommended!

Please specify a different user using the --uid option.

User information: uid=0 euid=0 gid=0 egid=0

  uid=uid, euid=euid, gid=gid, egid=egid,
 
 -------------- celery@6ae5fd398c10 v5.2.3 (dawn-chorus)
--- ***** ----- 
-- ******* ---- Linux-3.10.0-1160.59.1.el7.x86_64-x86_64-with-debian-9.11 2022-03-31 02:52:29
- *** --- * --- 
- ** ---------- [config]
- ** ---------- .> app:         tasks:0x7f00470ca550
- ** ---------- .> transport:   redis://:**@127.0.0.1:6379/1
- ** ---------- .> results:     redis://:**@127.0.0.1:6379/2
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery
                

[tasks]
  . tasks.add

[2022-03-31 02:52:29,388: INFO/MainProcess] Connected to redis://:**@127.0.0.1:6379/1
[2022-03-31 02:52:29,391: INFO/MainProcess] mingle: searching for neighbors
[2022-03-31 02:52:30,497: INFO/MainProcess] mingle: sync with 4 nodes
[2022-03-31 02:52:30,497: INFO/MainProcess] mingle: sync complete
[2022-03-31 02:52:30,511: INFO/MainProcess] celery@6ae5fd398c10 ready.


# 从控制台中可以看到一些celery的一些配置信息和运行信息

3.2 添加任务

# 需要cd到run.py同路径,且需要新打开一个bash窗口
python run.py
459b9b9f-de0e-4caf-bd23-f49ef89c797c
---console---


# 此时查看worker所在的bash窗口,窗口打印出了新的log信息
---console---
[2022-03-31 03:20:09,985: INFO/MainProcess] Task tasks.add[459b9b9f-de0e-4caf-bd23-f49ef89c797c] received
[2022-03-31 03:20:10,011: INFO/ForkPoolWorker-1] Task tasks.add[459b9b9f-de0e-4caf-bd23-f49ef89c797c] succeeded in 0.02414786597364582s: 7

连接redis查看结果存储

[root@centos-01 demo1]# redis-cli

127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> keys *
1) "celery-task-meta-459b9b9f-de0e-4caf-bd23-f49ef89c797c"
127.0.0.1:6379[2]> get celery-task-meta-459b9b9f-de0e-4caf-bd23-f49ef89c797c
"{\"status\": \"SUCCESS\", \"result\": 7, \"traceback\": null, \"children\": [], \"date_done\": \"2022-03-31T03:20:09.987307\", \"task_id\": \"459b9b9f-de0e-4caf-bd23-f49ef89c797c\"}"
127.0.0.1:6379[2]> 


# celery中backend使用的库为2,切换到对应的库中,查看所有的key,发现只有一个key,且key中包含AsyncResult 实例,查看该key
# 对应的value,正是我们执行的一些信息

3.4 扩展

在run.py中添加

# 查看任务执行状态,执行完成(不管是否发生异常还是正常执行)返回True,未执行返回False
print(result.ready())

# 如果任务出现异常,可以通过以下命令进行回溯
result.traceback


from tasks import app
from celery.result import AsyncResult

asy = AsyncResult(id=result, app=app)
# 是否正常执行完成,正常执行成功返回True,否则返回False
print(asy.successful())

# 执行成功打印结果
print(asy.get())

# 是否正常执行失败,失败返回True,否则返回False
print(asy.failed())
# 查看任务状态
print(asy.status)
# 执行状态一般有三种PENDING、RETRY、STARTED

3.3 停止worker

直接通过Ctrl + C停止即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/854119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设置height:100%无效的原因以及两种解决方法

原因&#xff1a;我们知道在把盒子宽度自适应为浏览器窗口宽度&#xff0c;只需设置width:100%就可轻松解决问题&#xff0c;但是让盒子的高度自适应浏览窗口的高度并非那么容易&#xff0c;这是因为css内部计算的原因 <!-- 高度实际为字体大小 --> <div class"…

ElasticSearch:环境搭建步骤

1、拉取镜像 docker pull elasticsearch:7.4.0 2、创建容器 docker run -id --name elasticsearch -d --restartalways -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch/plugins:/usr/share/elasticsearch/plugins -e "discovery.typesingle-node" elasti…

logo设计用什么工具比较好?为你推荐这9个

在海报设计工作中&#xff0c;logo设计是必不可少的一步&#xff0c;今天本文为大家推荐9个特别好用的logo生成器&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时灵感是一个结合了AI技术的logo生成器&#xff0c;它无需设计师提供设计素材&#xff0c;只要在文本框中…

软件系统测试报告

1.简介 1.1.编写目的 本文档是对重庆市XXX项目验收测试所做的说明&#xff0c;为充分利用已有的软硬件资源&#xff0c;配合对系统应用模块的运行测试方案,查缺补漏完善系统的各项具体功能,保证项目的顺利进行&#xff0c;本测试报告有助于实现以下目标&#xff1a; 明确本次…

【Linux命令详解 | grep命令】 grep命令用于在文件中搜索指定模式的文本,功能强大且常用

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 使用基本模式搜索2. 忽略大小写匹配3. 反向匹配4. 递归搜索目录5. 显示文件名6. 显示行号7. 显示上下文行8. 启用扩展正则表达式9. 将模式视为固定字符串10. 使用颜色高亮显示匹配文本 总结 简介 在Linux系统中&…

12v转5v降压模块

问&#xff1a;什么是12V转5V降压模块&#xff1f;它的功能是什么&#xff1f; 答&#xff1a;12V转5V降压模块是一种电子设备&#xff0c;用于将输入电压为12V的直流电转换为输出电压为5V的直流电。它的主要功能是为电子设备提供所需的适当电压&#xff0c;以便它们能够正常运…

AI里的烟火气:实在RPA数字员工频频上岗九阳、海尔、美的等多家上市家电企业

1994年&#xff0c;九阳创始人王旭宁研发出了世界上第一台豆浆机&#xff0c;他将原本需要耗费七八个小时来泡豆子、推磨、过滤、蒸煮的时间&#xff0c;缩短到了几分钟。这是生产力的一次重大进步&#xff0c;也标志着九阳这样一家品质小家电领导品牌&#xff0c;开始走入大众…

logistic的分叉图

logistic是最基础、最常用的混沌序列。 了解其分叉图很关键。 下面&#xff0c;是混沌序列的分叉图。 分叉图是怎么得到的呢&#xff0c;实际上就是通过不断地迭代&#xff0c;观察其最终值在哪。 那到底在哪呢&#xff0c;我们分别绘制了最后20个序列的分叉图如下。 很显然…

【算法篇C++实现】五大常规算法

文章目录 &#x1f680;一、分治法⛳&#xff08;一&#xff09;算法思想⛳&#xff08;二&#xff09;相关代码 &#x1f680;二、动态规划算法⛳&#xff08;一&#xff09;算法思想⛳&#xff08;二&#xff09;相关代码 &#x1f680;三、回溯算法⛳&#xff08;一&#xf…

2000-2022年上市公司环境不确定性(原始数据+测算代码+测算结果)

2000-2022年上市公司环境不确定性指数&#xff08;含原始数据 代码和计算结果&#xff09; 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;gupiao代码、名称、日期、年份、总资产净利润率ROA、营业收入、上市日期、成立日期、行业代码、年末是否ST或PT、行业、EU未调整…

【CSS3】CSS3 动画 ③ ( 动画属性 | CSS3 常见动画属性简介 | 动画属性简写方式 | 动画属性简写语法 | 使用动画制作热点地图 )

文章目录 一、CSS3 动画属性1、CSS3 常见动画属性简介2、代码示例 - CSS3 常见动画属性使用 二、CSS3 动画属性简写方式1、CSS3 动画属性简写语法2、animation 简写动画属性提示3、动画属性简写形式与原形式对比4、代码示例 - CSS3 动画属性简写示例 三、使用动画制作热点地图1…

关于在c++中使用数组名作为函数参数,或者使用数组名的地址作为函数参数问题的一些研究

前言 使用数组名作为函数参数&#xff0c;或者使用数组名的地址作为函数参数&#xff0c;常常出现于对于字符串的读入问题之中。 常有以下两种写法&#xff1a; 这是使用数组名作为函数参数 #include<cstdio> char s[100]; int main() {scanf("%s",s); }在…

Java课题笔记~ 使用 AspectJ 的 AOP 配置管理事务(掌握)

使用 XML 配置事务代理的方式的不足是&#xff0c;每个目标类都需要配置事务代 理。当目标类较多&#xff0c;配置文件会变得非常臃肿。 使用 XML 配置顾问方式可以自动为每个符合切入点表达式的类生成事务代 理。其用法很简单&#xff0c;只需将前面代码中关于事务代理的配置…

【C++】开源:CGAL计算几何库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍CGAL计算几何库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;…

COCOS项目运行的时候图片模糊的原因

1、首先。用X坐标来分析&#xff0c;如果size*Anchor Position有小数&#xff0c;如上图57*0.5667695.5。这样就会导致x模糊。如果y同样计算结果包含小数&#xff0c;那么y也会模糊。xy同时模糊的情况是最模糊的。 2、如果当前node没有问题&#xff0c;那么就要检查上级node是…

Linux学习之awk字段

awk把每行内容称之为记录&#xff0c;而使用特殊字符分割之后的字符串称为 字段。 字段的引用 echo a : 1 : good :::: >> awktest.txt echo b : 2 : well :::: >> awktest.txt echo c : 3 : food :::: >> awktest.txt echo d : 4 : hood :::: >> aw…

effective c++学习笔记(前五章)

目录 一 让自己习惯C01 视C为一个语言联邦02 尽量以const&#xff0c;enums&#xff0c;inline替换#define**指针常量--指针类型的常量&#xff08;int * const p)****常量指针—指向“常量”的指针&#xff08;const int * p&#xff0c; int const * p&#xff09;**类静态常…

Java分布式微服务4——异步服务通讯(RabbitMQ)中间件

文章目录 微服务的远程异步调用MQ介绍RabbitMQRabbitMQ结构RabbitMQ的单机部署1.下载镜像2.安装MQ RabbitMQ入门常见消息模型 SpringAMQPSpringAMQP实现基础消息队列SpringAMQP实现工作队列SpringAMQP实现发布订阅1. Fanout Exchange 广播模式2. Direct Exchange 路由模式3. To…

Add-in Express for Microsoft Office and Delphi Crack

Add-in Express for Microsoft Office and Delphi Crack 适用于Microsoft Office和Delphi VCL的Add-in Express使您能够在几次点击中为Microsoft Office开发专业插件。它生成基于COM的项目&#xff0c;这些项目包含Microsoft Office外接程序或智能标记的所有必要功能&#xff0…

3分钟创建新生分班查询二维码,无需技术、0成本

作为教师&#xff0c;我们深知分班是一项极其重要的任务&#xff0c;需要综合考虑学生的性格、能力和兴趣等多个方面&#xff0c;以确保每个学生都能够获得最佳的学习环境和成绩。在本文中&#xff0c;我将分享一种便捷的方式来告知家长有关分班录取情况的方法。 通常&#xf…