Celery 是一个简单、灵活且可靠的分布式系统——python库

目录

引言

Celery 是什么?

安装 Celery

配置 Celery

创建任务

运行 Celery Worker

调用任务

更多示例

示例 1:发送电子邮件

示例 2:图片处理

示例 3:数据处理

结论



引言

今天我们来分享一个超强的 python 库,celery

Github地址:https://github.com/celery/celery

在现代应用开发中,后台任务处理是一项非常常见的需求。无论是处理大批量的数据,还是发送电子邮件,亦或是执行耗时的计算任务,将这些操作放在后台执行可以显著提升应用的性能和用户体验。Celery 就是这样一个强大的分布式任务队列系统,它能够帮助我们轻松地实现后台任务处理。

在这篇文章中,我们将详细介绍 Celery 的基本概念、安装和配置过程,并通过一些简单的示例代码来展示如何使用 Celery 来处理后台任务。

Celery 是什么?

Celery 是一个简单、灵活且可靠的分布式系统,可以处理大量消息,用于实时操作、调度任务和并发执行等场景。Celery 的核心概念包括任务(task)和队列(queue),任务是你希望异步执行的功能,而队列是存放这些任务的地方。

安装 Celery

在开始使用 Celery 之前,我们需要先安装它。Celery 依赖于一个消息代理(例如 RabbitMQ 或 Redis)来协调任务的分发。在这里,我们选择使用 Redis 作为消息代理。首先,我们需要安装 Celery 和 Redis。

使用以下命令安装 Celery 和 Redis:

pip install celery[redis]

同时,我们需要确保系统中已经安装了 Redis。如果还没有安装 Redis,可以参考 Redis 的官方文档进行安装。

配置 Celery

安装完成后,我们需要配置 Celery。通常情况下,我们会在项目中创建一个专门用于 Celery 配置的文件,例如 celery.py

下面是一个简单的 Celery 配置示例:

from celery import Celery

# 创建 Celery 实例
app = Celery('tasks', broker='redis://localhost:6379/0')

# 加载配置
app.conf.update(
    result_backend='redis://localhost:6379/0',
    task_serializer='json',
    result_serializer='json',
    accept_content=['json'],
    timezone='UTC',
    enable_utc=True,
)

在这个示例中,我们创建了一个名为 app 的 Celery 实例,并指定 Redis 作为消息代理和结果存储的后台。我们还配置了任务的序列化格式和时区等参数。

创建任务

有了 Celery 配置后,我们就可以开始创建任务了。任务是 Celery 的核心,它是我们希望异步执行的函数。在这里,我们定义一个简单的任务来演示 Celery 的使用。

创建一个名为 tasks.py 的文件,并添加以下代码:

from celery import Celery

app = Celery('tasks', broker='redis://localhost:6379/0')

@app.task
def add(x, y):
    return x + y

在这个示例中,我们定义了一个名为 add 的任务函数,它接受两个参数 x 和 y,并返回它们的和。通过 @app.task 装饰器,我们将 add 函数声明为一个 Celery 任务。

运行 Celery Worker

要执行 Celery 任务,我们需要启动一个 Celery Worker。Worker 是负责执行任务的进程。使用以下命令启动 Celery Worker:

celery -A tasks worker --loglevel=info

在这个命令中,-A tasks 指定了我们之前创建的 tasks.py 文件,而 --loglevel=info 则设置了日志级别。

调用任务

现在,我们已经配置好了 Celery 并启动了 Worker,接下来我们就可以调用任务了。我们可以通过 Celery 的 delay 方法来异步调用任务。

创建一个新的 Python 文件(例如 main.py),并添加以下代码:

from tasks import add

result = add.delay(4, 6)
print('Task result:', result.get(timeout=10))

在这个示例中,我们使用 add.delay(4, 6) 来异步调用 add 任务,并传入参数 4 和 6result.get(timeout=10) 用于获取任务的执行结果,如果在 10 秒内未完成,则抛出异常。

更多示例

除了简单的加法任务,Celery 还可以处理更复杂的任务,例如发送电子邮件、处理文件等。以下是一些更高级的示例:

示例 1:发送电子邮件

假设我们需要在用户注册后发送欢迎邮件,我们可以使用 Celery 来异步处理邮件发送任务。

from celery import Celery
import smtplib
from email.mime.text import MIMEText

app = Celery('email_tasks', broker='redis://localhost:6379/0')

@app.task
def send_welcome_email(email):
    msg = MIMEText('Welcome to our service!')
    msg['Subject'] = 'Welcome'
    msg['From'] = 'noreply@example.com'
    msg['To'] = email

    with smtplib.SMTP('smtp.example.com') as server:
        server.login('user', 'password')
        server.sendmail('noreply@example.com', [email], msg.as_string())

在这个示例中,我们定义了一个 send_welcome_email 任务,用于发送欢迎邮件。通过 Celery,我们可以在用户注册后异步调用这个任务,从而避免阻塞主线程。

示例 2:图片处理

假设我们需要对用户上传的图片进行处理,例如生成缩略图,我们可以使用 Celery 来异步处理这些任务。

from celery import Celery
from PIL import Image

app = Celery('image_tasks', broker='redis://localhost:6379/0')

@app.task
def generate_thumbnail(image_path, thumbnail_path):
    with Image.open(image_path) as img:
        img.thumbnail((128, 128))
        img.save(thumbnail_path, "JPEG")

在这个示例中,我们定义了一个 generate_thumbnail 任务,用于生成图片的缩略图。通过 Celery,我们可以在用户上传图片后异步调用这个任务,从而避免影响用户体验。

示例 3:数据处理

假设我们需要对大批量的数据进行处理,例如对数据库中的记录进行批量更新,我们可以使用 Celery 来异步处理这些任务。

from celery import Celery
import sqlite3

app = Celery('data_tasks', broker='redis://localhost:6379/0')

@app.task
def update_records():
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()
    
    cursor.execute("UPDATE records SET status = 'processed' WHERE status = 'pending'")
    conn.commit()
    conn.close()

在这个示例中,我们定义了一个 update_records 任务,用于批量更新数据库中的记录。通过 Celery,我们可以将这些耗时的操作放在后台处理,从而提升应用的性能。

结论

通过这篇文章,我们初步了解了 Celery 的基本概念和使用方法。Celery 是一个非常强大的工具,它可以帮助我们轻松地实现后台任务处理,从而提升应用的性能和用户体验。希望通过本文的介绍,大家能够对 Celery 有一个初步的认识,并能在实际项目中尝试使用 Celery 来处理后台任务。

在接下来的学习中,大家可以深入了解 Celery 的高级功能,例如任务调度、重试机制等,并尝试在实际项目中应用这些功能。祝大家学习愉快!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序下载

首先进入微信网站链接:微信公众平台 (qq.com) 下载开发工具: 下载 / 稳定版更新日志 (qq.com) 下载稳定版

AV1技术学习:Translational Motion Compensation

编码块根据运动矢量在参考帧中找到相应的预测块,如下图所示,当前块的左上角的位置为(x0, y0),在参考帧中找到同样位置(x0, y0)的块,根据运动矢量移动到目标参考块(左上角位置为:(x1, y1))。 AV1…

C语言之带环链表

带环链表是数据结构链表中的一个经典问题,这里我们研究该问题分为两个方向:链表是否带环、返回链表的入环节点。 下面我们通过两个题目来分析带环链表: 1.判断链表是否带环 141. 环形链表 - 力扣(LeetCode) 那么我们…

# Redis 入门到精通(四)-- linux 环境安装 redis

Redis 入门到精通(四)-- linux 环境安装 redis 一、linux 环境安装 redis – 基于 Linux 安装 redis 1、基于 Center 0S7 或者 unbunt-18.04 安装 Redis 1)下载安装包wget http://download.redis.io/releases/redis-?.?.?.tar.gz 如&…

Unity最新第三方开源插件《Stateful Component》管理中大型项目MonoBehaviour各种序列化字段 ,的高级解决方案

上文提到了UIState, ObjectRefactor等,还提到了远古的NGUI, KBEngine-UI等 这个算是比较新的解决方法吧,但是抽象出来,问题还是这些个问题 所以你就说做游戏是不是先要解决这些问题? 而不是高大上的UiImage,DoozyUI等 Mono管理引用基本用法 ① 添加Stateful Component …

每日复盘-20240715

20240715 六日涨幅最大: ------1--------300807--------- 天迈科技 五日涨幅最大: ------1--------300807--------- 天迈科技 四日涨幅最大: ------1--------300807--------- 天迈科技 三日涨幅最大: ------1--------300713--------- 英可瑞 二日涨幅最大: ------1--------3007…

前端Vue组件化实践:自定义加载组件的探索与应用

在前端开发领域,随着业务逻辑复杂度的提升和系统规模的不断扩大,传统的开发方式逐渐暴露出效率低下、维护困难等问题。为了解决这些挑战,组件化开发作为一种高效、灵活的开发模式,受到了越来越多开发者的青睐。本文将结合实践&…

代码随想录训练营第三十六天 1049最后一块石头的重量II 494目标和

第一题: 原题链接:1049. 最后一块石头的重量 II - 力扣(LeetCode) 思路: 首先确认这是一道01背包问题的题目,如何转换:剩下尽可能小的重量,如何剩下呢?跟分割等和子集很…

基于RAG大模型的变电站智慧运维-第十届Nvidia Sky Hackathon参赛作品

第十届Nvidia Sky Hackathon参赛作品 1. 项目说明 变电站是用于变电的设施,主要的作用是将电压转化,使电能在输电线路中能够长距离传输。在电力系统中,变电站起到了极为重要的作用,它可以完成电能的负荷分配、电压的稳定、容错保…

基坑安全:自动化监测系统的革新力量

在日新月异的基坑工程领域,基坑安全自动化监测系统犹如一位守护者,以其独特的优势,为工程的安全与质量保驾护航。该系统集先进的测量仪器、计算机技术与现代传感技术于一体,对基坑的围护结构及周边环境进行全方位、高精度的实时监…

【C++基础】初识C++(1)

目录 一、认识C 1.1 C 相关概念 1.2 C的发展 1.3 C的关键字 1.4 第一个程序 二、命名空间 2.1 namespace的定义 2.2 命名空间的使用 三、C输入和输出 四、缺省函数 五、函数重载 一、认识C 1.1 C 相关概念 1983年,Bjarne Stroustrup在C语⾔的基础上…

内网安全:权限维持的各种姿势

1.Linux权限维持 2.Windows权限维持 目录: 一.Linux权限维持: 1.webshell: 2.定时任务: 3.SUID后门: 4.SSH Key免密登录后门: 5.添加用户后门: 二.Windows权限维持 1.计划任务后门&…

NetSuite RPA技术实践

近期有同学提出一个需求。 “需要存取的報表是存貨分類帳(stock ledger),將查到的各個[Item|Location]作為一組key,分別將報表中的「期末庫存量」「期末平均成本」「期末庫存量價值」這三欄的值,在每個月月底的時候自動將這個報表的這三欄數…

rollup打包工具

rollup打包工具 在学习vite和vue3源码的时候,接触到了rollup,所以过来学习一下 什么是rollup rollup是一个模块化的打包工具,会将javascript文件进行合并。比起webpack,webpack在打包的时候会进行代码注入(保障兼容性)&#xf…

位图——哈希思想的应用

三、位图 0、位图概念 所谓位图,就是用每一个比特位来存放某种状态(0或1),是一种哈希思想的应用,适用于海量数据,整数,数据无重复的场景。通常是用来判断某个数据存不存在的。(注意…

GaussDB DWS 详解

文章目录 GaussDB DWS 详解一、简介二、DWS的分布式架构架构概述关键组件 三、分布式查询数据查询流程SQL执行的示例 批注:本文引鉴了Forlogen博主的一些内容,并加以补充,以供学习了解。 GaussDB DWS 详解 一、简介 DWS(Data Warehouse Ser…

数据库-三范式

第一范式 1 数据库所有字段都只有单一属性。 2 单一属性由基本数据类型构成。 3 数据库的表都是二维的行与列。 例如上面的例子就不满足第一范式,因为是可以继续拆分的,拆分为更多的属性。 第二范式 1 符合第一范式 2 表必须有个主建 3 其它字段可以…

《0基础》学习Python——第十一讲__时间函数

一、时间函数是Python中的内置函数和模块,用于处理日期和时间相关的操作。以下是常用的时间函数的种类和用法: 1、time.time():返回当前时间的时间戳。 时间戳(timestamp)是一种表示日期和时间的方式,它是一…

Linux--USB驱动开发(二)插入USB后的内核执行程序

一、USB总线驱动程序的作用 a)识别USB设备 1.1 分配地址 1.2 并告诉USB设备(set address) 1.3 发出命令获取描述符 b)查找并安装对应的设备驱动程序 c)提供USB读写函数 二、USB设备工作流程 由于内核自带了USB驱动,所以我们先插入一个U…

CSS-0_3 CSS和单位

文章目录 CSS的值和单位属性值长度单位CSS和绝对单位CSS和相对单位百分比em & rem视口 颜色单位 碎碎念 CSS的值和单位 我们知道,CSS是由属性和属性值所组成的表 随着CSS的发展,属性不说几千也有几百,我从来不支持去背诵所有的可能性。…