暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

轻松完成异步任务,一文搞懂Python Celery

315

本文通过一个示例简要介绍Celery的使用及其工作原理。

长按关注《Python学研大本营》,加入读者群,分享更多精彩

虽然现代的网络应用比以往任何时候都更快速、更便捷,但仍有许多情况下,需要把繁重的任务转移到系统的其他部分执行,而不是在主线程上进行工作。

这些情况中的示例如下:

  • 周期性任务 —— 计划在特定时间间隔内运行的工作。例如,每日、每月的报告生成。
  • 第三方工具 —— 应用程序应该快速向用户返回响应,而不是等待其他任务先完成。例如,发送电子邮件、通知,将更新进度传递给内部工具。
  • 长时间运行的工作 —— 执行复杂或资源昂贵的工作,并且用户需要等待工作完成。例如。DAG工作流、基于Map-Reduce的任务、长时间运行的Spark作业等。

那么,如何处理这些情况呢?这时,Celery就派上用场了。

什么是Celery?

Celery是一个开源的任务队列实现,通常与基于Python的网络框架(如Flask
Django
)相结合,在典型的请求-响应周期之外异步执行任务。

因此,Celery本质上是一个基于分布式消息传递的任务队列。执行单元或任务在一个或多个worker上使用多处理、gevent
Eventlet
同时执行。这些任务可以同步执行(即等到准备就绪)或异步执行(即在后台)。

Celery是如何工作的?

Celery是一个分布式任务队列,基于生产者-消费者模式。

任务队列是用于跨线程和机器分配工作的机制,本质上是生产者(Web应用程序)和消费者(Celery工作者)之间的消息中介。

Celery通过消息进行交互,代理(broker)在客户(生产者)和工作者(消费者)之间充当中间人。为了启动任务,客户端将消息推送到队列中,然后代理将该消息传递给工作者。

Celery系统可以由多个worker和broker组成,这为高可用性和横向扩展提供了可能。

简而言之,Celery客户端是生产者,它通过消息代理向队列中添加新的任务。然后,Celery工作者同样通过消息代理从队列中获取新的任务。一旦处理完毕,结果就会存储在结果后端。

工作实例

下面的例子将使用RedisMQ
作为消息代理。

设置Redis

在linux/macOS系统上,通过以下命令在本地运行Redis服务器:

$ wget http://download.redis.io/redis-stable.tar.gz
$ tar xvzf redis-stable.tar.gz
$ rm redis-stable.tar.gz
cd redis-stable
$ make

设置好Redis后,通过执行以下命令运行Redis服务器:

$ redis-server

该服务器在默认的6379
端口运行。

设置应用程序

首先,在本地设置Python项目。

Celery可以通过标准工具如pip
easy_install
来安装。通过以下命令安装Celery和Redis:

pip install celery redis==4.3.4

现在需要一个Celery实例来运行应用程序,Celery实现任何任务都是以实例开始,比如创建和管理任务等。

在项目中创建一个文件tasks.py

From celery import Celery

broker_url = 'redi://localhost:6379/0'

app = Celery('tasks',broker = broker_url)

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

这里定义了一个简单的任务add()
,返回两个数字的总和。

运行Celery Worker

在终端上,切换到项目位置并用以下命令运行Celery worker:

$ celery -A tasks worker - loglevel=info

关于Celery worker命令行的详细信息,可以使用help

$ celery worker - help

调用任务

在Celery中,使用delay()
方法来调用任务。

打开项目的另一个终端窗口并运行以下命令:

$ python

这将打开Python命令行。

>> from tasks import add
>> add.delay(1,2)

这将返回一个AsyncResult实例,可以用来检查任务状态,获得其返回值,等待任务完成,也可以在失败时获得异常和回溯。

运行add.delay()
命令后,任务会被推送到队列中,然后被worker获取。这可以在Celery worker终端上进行验证,可以清楚地看到任务被接收,之后任务成功完成。

推荐书单

《Python从入门到精通(微课精编版)》

《Python从入门到精通(微课精编版)》使用通俗易懂的语言、丰富的案例,详细介绍了Python语言的编程知识和应用技巧。全书共24章,内容包括Python开发环境、变量和数据类型、表达式、程序结构、序列、字典和集合、字符串、正则表达式、函数、类、模块、异常处理和程序调试、进程和线程、文件操作、数据库操作、图形界面编程、网络编程、Web编程、网络爬虫、数据处理等,还详细介绍了多个综合实战项目。其中,第24章为扩展项目在线开发,是一章纯线上内容。全书结构完整,知识点与示例相结合,并配有案例实战,可操作性强,示例源代码大都给出详细注释,读者可轻松学习,快速上手。本书采用O2O教学模式,线下与线上协同,以纸质内容为基础,同时拓展更多超值的线上内容,读者使用手机微信扫一扫即可快速阅读,拓展知识,开阔视野,获取超额实战体验。

购买链接:https://item.jd.com/13524355.html

精彩回顾

《使用ChatGPT API创建Python文档,竟然如此简单》

《16 个必知必会的 Python 技巧,助你高效编程》

《餐厅数据一网打尽,用Python采集并分析TripAdvisor》

《得来全不费功夫,使用Python爬虫自动采集Cookies、URL等网页数据》

《Pandas大显身手,数据分析更轻松》

《GPT-4已来,Python API使用最新版GPT》

长按关注《Python学研大本营》,加入读者群
长按访问【IT今日热榜】,发现每日技术热点

文章转载自Python学研大本营,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论