Celery的基本使用

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=0uid=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-cli127.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.tracebackfrom tasks import app
from celery.result import AsyncResultasy = 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.mzph.cn/news/29872.shtml

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

相关文章

无涯教程-Perl - 格式化

Perl使用称为“formats”的模板来输出内容。要使用Perl的格式函数,必须先定义一种格式,然后才能使用该格式写入格式化的数据。 定义格式 以下是定义Perl格式的语法- format FormatName fieldline value_one, value_two, value_three fieldline value…

图像的平移变换之c++实现(qt + 不调包)

1.基本原理 设dx为水平偏移量&#xff0c;dy为垂直偏移量&#xff0c;则平移变换的坐标映射关系为下公式&#xff0c;图像平移一般有两种方式。 1.不改变图像大小的平移&#xff08;一旦平移&#xff0c;相应内容被截掉&#xff09; 1&#xff09;当dx > width、dx < -wi…

(MVC)SpringBoot+Mybatis+Mapper.xml

前言&#xff1a;本篇博客主要对MVC架构、Mybatis工程加深下理解&#xff0c;前面写过一篇博客&#xff1a;SprintBoothtml/css/jsmybatis的demo&#xff0c;里面涉及到了Mybatis的应用&#xff0c;此篇博客主要介绍一种将sql语句写到了配置文件里的方法&#xff0c;即Mybatis里…

vue去掉所有输入框两边空格,封装指令去空格,支持Vue2和Vue3,ElementUI Input去空格

需求背景 就是页面很多表单输入框&#xff0c;期望在提交的时候&#xff0c;都要把用户两边的空格去掉 ❌使用 vue 的指令 .trim 去掉空格 中间会输入不了空格&#xff0c; 比如我想输入 你好啊 中国, 这中间的空格输入不了&#xff0c;只能变成 你好啊中国 ❌在提交的时候使用…

cesium学习记录04-坐标系

一、地理坐标系和投影坐标系的关系 地理坐标系 (Geographic Coordinate System, GCS) 定义&#xff1a;地理坐标系是一个基于三维地球表面的坐标系统。它使用经度和纬度来表示地点的位置。 特点&#xff1a; 使用经纬度来定义位置。 基于特定的地球参考椭球体。 适用于全球范…

设备固定资产管理系统

资产管理是企业经营和发展的基础&#xff0c;特别是设备资产管理。适当的设备资产管理可以有效地提升企业的经营效率&#xff0c;为提高核心竞争能力提供高效的前提。 固资及设备管理系统&#xff08;EAM&#xff09;它是一种有效的固定资产管理模式&#xff0c;可以帮助企业更…

gradle 命令行单元测试执行问题

文章目录 问题&#xff1a;命令行 执行失败最终解决方案&#xff08;1&#xff09;ADB命令&#xff08;2&#xff09;Java 环境配置 问题&#xff1a;命令行 执行失败 命令行 执行测试命令 无法使用&#xff08;之前还能用的。没有任何改动&#xff0c;又不能用了&#xff09; …

Unity游戏源码分享-仿开心消消乐Match3Jewel

Unity游戏源码分享-仿开心消消乐Match3Jewel 工程地址&#xff1a; https://download.csdn.net/download/Highning0007/88198762

uniapp 微信小程序 上下滚动的公告通知(只取前3条)

效果图&#xff1a; <template><view class"notice" click"policyInformation"><view class"notice-icon"><image mode"aspectFit" class"img" src"/static/img/megaphone.png"></i…

企业权限管理(三)-产品添加

产品添加 从product-list.jsp跳转到product-add.jsp <button type"button" class"btn btn-default" title"新建" onclick"location.href${pageContext.request.contextPath}/pages/product-add.jsp"><iclass"fa fa-file…

springboot集成分布式任务调度系统xxl-job(调度器和执行器)

一、部署xxl-job服务端 下载xxl-job源码 下载地址&#xff1a; https://gitee.com/xuxueli0323/xxl-job 二、导入项目、创建xxl_job数据库、修改配置文件为自己的数据库 三、启动项目、访问首页 访问地址&#xff1a; http://localhost:8080/xxl-job-admin/ 账号&#xff1…

three.js修改内置材质着色器代码

通常我们是通过修改扩展three.js内置的材质来实现一些复杂的效果的&#xff0c;而不是使用shaderMaterial材质从零开始实现。比如说很满意MeshStandardMaterial&#xff08;一种常规材质&#xff09;的效果&#xff0c;但是我们希望在这个材质上添加一些顶点动画。如果我们打算…

php webshell 免杀入门

webshell 查杀软件&#xff1a; d盾、安全狗、护卫神、Sangfor WebShellKill 在线查杀 百度WEBDIR https://scanner.baidu.com 河马 https://www.shellpub.com cloudwalker牧云 https://webshellchop.chaitin.cn 查杀技术 静态检测、动态检测、日志检查 静态检查&#xff1a…

Cesium中通过射线计算日照

Cesium中通过射线计算日照 前段时间接触到一个需求&#xff0c;需要实时的计算建筑的日照&#xff0c;通常优先通过shadow map来实现。通过shadow map可以直接获取某一时刻的光照信息&#xff0c;累积不同太阳光位置的shadow map即可得到物体表面的光照时长。 不过本人技术有限…

SPINN:基于设备和云的神经网络协同递进推理

SPINN&#xff1a;基于设备和云的神经网络协同递进推理 论文标题&#xff1a;SPINN: synergistic progressive inference of neural networks over device and cloud 原文链接&#xff1a;https://dl.acm.org/doi/10.1145/3372224.3419194 论文动机 现代CNN过多的计算需求&am…

将 Kwargs 传递给 Python 中的另一个函数

文章目录 Python 中的关键字参数在 Python 中使用**kwargs 调用函数使用 Python 将 kwargs 传递给另一个函数总结 Python 列出了可以传递给程序中的函数的两种类型的参数。 非关键字参数 (**args) 和关键字参数 (**kwargs)。 通常&#xff0c;python 函数必须使用正确数量的参…

华秋亮相2023世界汽车制造技术暨智能装备博览会,推动汽车产业快速发展

洞悉全球汽车产业格局&#xff0c;前瞻业界未来趋势。2023年7月27日-30日&#xff0c;时隔三年&#xff0c;重聚武汉国际博览中心&#xff0c;2023世界汽车制造技术暨智能装备博览会盛大开幕。深耕汽车行业多年的世界汽车制造技术暨智能装备博览会&#xff0c;掀起行业热点新高…

死磕Android性能优化,卡顿原因与优化方案

随着移动互联网的快速发展&#xff0c;Android应用的性能优化变得尤为重要。卡顿是用户体验中最常见的问题之一&#xff0c;它会导致应用的响应变慢、界面不流畅&#xff0c;甚至影响用户的使用体验。因此&#xff0c;我们需要深入了解卡顿问题的原因&#xff0c;并寻找相应的解…

Java中ArrayList常用方法的学习

Java中ArrayList常用方法的学习 需求分析代码实现小结Time 需求分析 ArrayList集合的常用方法学习 代码实现 java.util.ArrayList;/*** Author:LQ* Description:* Date:Created in 16:45 2023/8/9*/ public class ListTest {public static void main(String[] args) {ArrayLis…

WMS系列:层级树的surface 的创建

WMS 创建的surface 与 surfaceflinger 创建的Layer 是一一对应的&#xff0c;只不过可能是创建不同的 Layer 1. DefaultTaskDisplayArea 对应的surface 的创建 DefaultTaskDisplayArea 的调用栈如下&#xff0c;是在系统进程启动服务的时候&#xff0c;去创建对应的SurfaceCont…