Python 最强大的任务调度框架 Celery!


Python 最强大的任务调度框架 Celery!

文章插图
来源:古明地觉的编程教室
什么是 celery
这次我们来介绍一下 Python/ target=_blank class=infotextkey>Python 的一个第三方模块 celery , 那么 celery 是什么呢?
 
  •  
    celery 是一个灵活且可靠的 , 处理大量消息的分布式系统 , 可以在多个节点之间处理某个任务;
     
  •  
    celery 是一个专注于实时处理的任务队列 , 支持任务调度;
     
  •  
    celery 是开源的 , 有很多的使用者;
     
  •  
    celery 完全基于 Python 语言编写;
     
 
所以 celery 本质上就是一个任务调度框架 , 类似于 Apache 的 airflow , 当然 airflow 也是基于 Python 语言编写 。
不过有一点需要注意 , celery 是用来调度任务的 , 但它本身并不具备存储任务的功能 , 而调度任务的时候肯定是要把任务存起来的 。因此要使用 celery 的话 , 还需要搭配一些具备存储、访问功能的工具 , 比如:消息队列、redis缓存、数据库等等 。官方推荐的是消息队列 RabbitMQ , 个人认为有些时候使用 Redis 也是不错的选择 , 当然我们都会介绍 。
那么 celery 都可以在哪些场景中使用呢?
 
  •  
    异步任务:一些耗时的操作可以交给celery异步执行 , 而不用等着程序处理完才知道结果 。比如:视频转码、邮件发送、消息推送等等;
     
  •  
    定时任务:比如定时推送消息、定时爬取数据、定时统计数据等等;
     
 
celery 的架构
我们看一下 celery 的架构:
Python 最强大的任务调度框架 Celery!

文章插图
 
  •  
    producer:生产者 , 专门用来生产任务(task);
     
  •  
    celery beat:任务调度器 , 调度器进程会读取配置文件的内容 , 周期性地将配置文件里面到期需要执行的任务发送给消息队列 , 说白了就是生产定时任务;
     
  •  
    broker:任务队列 , 用于存放生产者和调度器生产的任务 。一般使用消息队列或者 Redis 来存储 , 当然具有存储功能的数据库也是可以的 。这一部分是 celery 所不提供的 , 需要依赖第三方 。作用就是接收任务 , 存进队列;
     
  •  
    worker:任务的执行单元 , 会将任务从队列中顺序取出并执行;
     
  •  
    backend:用于在任务结束之后保存状态信息和结果 , 以便查询 , 一般是数据库 , 当然只要具备存储功能都可以作为 backend;
     
 
下面我们来安装 celery , 安装比较简单 , 直接 pip install celery 即可 。这里我本地的 celery 版本是 5.2.7 , Python 版本是 3.8.10 。
另外 , 由于 celery 本身不提供任务存储的功能 , 所以这里我们使用 Redis 作为消息队列 , 负责存储任务 。因此你还要在机器上安装 Redis , 我这里有一台云服务器 , 已经安装好了 。
后续 celery 就会将任务存到 broker 里面 , 当然要想实现这一点 , 就必须还要有能够操作相应 broker 的驱动 。Python 操作 Redis 的驱动也叫 redis , 操作 RabbitMQ 的驱动叫 pika , 直接 pip install ... 安装即可 。
celery 实现异步任务
我们新建一个工程 , 就叫 celery_demo , 然后在里面新建一个 App.py 文件 。
# 文件名:app.py
import time
# 这个 Celery 就类似于 flask.Flask
# 然后实例化得到一个app
from celery import Celery

 
# 指定一个 name、以及 broker 的地址、backend 的地址


推荐阅读