0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

干货:基于Redis配置Celery任务(附源码)

如意 来源:马哥Linux运维 作者:零壹軒 2020-09-03 10:53 次阅读

作为一个分布式异步计算框架,Celery虽然常用于Web框架中,但也可以单独使用。 虽然常规搭配的消息队列是RabbitMQ,但是由于某些情况下系统已经包含了Redis,那就可以复用。

以下撇开Web框架,介绍基于Redis配置Celery任务的方法。

pip install celery[redis]

项目结构

干货:基于Redis配置Celery任务(附源码)

其中,main.py是触发Task的业务代码。当然,文件名可以随意改。celery.py是Celery的app定义的位置,tasks.py是Task定义的位置,文件名不建议修改。

配置Celery

在celery.py中写入如下代码:

干货:基于Redis配置Celery任务(附源码)

其中,REDIS_URL从同一的配置settings.py中引入, 形式大概是redis://localhost:6379/0。这里既用Redis来当broker,又用来当backend。即,既当消息队列,又当结果反馈的数据库(默认仅保存1天)。

在include=,需要填一个下游worker的包名列表。这里选择了同一个包的tasks.py文件。

额外设置的task_track_started,是命令Worker反馈STARTED状态。默认情况下,是无法知道任务什么时候开始执行的。

编写任务并调用

在tasks.py文件中,添加异步任务的实现。

干货:基于Redis配置Celery任务(附源码)

在需要发起任务的地方,用.apply_async可以触发异步调用。即,实际只是向消息队列发送消息,真正的执行操作在远程。

干货:基于Redis配置Celery任务(附源码)

运行Worker:

celery -A your_project worker

运行原理

一次Task从触发到完成,序列图如下:

干货:基于Redis配置Celery任务(附源码)

其中,main代表业务代码主进程。它可能是Django、Flask这类Web服务,也可能是一个其它类型的进程。worker就是指Celery的Worker。

main发送消息后,会得到一个AsyncResult,其中包含task_id。仅通过task_id,也可以自己构造一个AsyncResult,查询相关信息。其中,代表运行过程的,主要是state。

worker会持续保持对Redis(或其它消息队列,如RabbitMQ)的关注,查询新的消息。如果获得新消息,将其消费后,开始运行do_sth。运行完成会把返回值对应的结果,以及一些运行信息,回写到Redis(或其它backend,如Django数据库等)上。在系统的任何地方,通过对应的AsyncResult(task_id)就可以查询到结果。

Celery Task的状态

以下是状态图:

干货:基于Redis配置Celery任务(附源码)

其中,除SUCCESS外,还有失败(FAILURE)、取消(REVOKED)两个结束状态。而RETRY则是在设置了重试机制后,进入的临时等待状态。

另外,如果保存在Redis的结果信息被清理(默认仅保存1天),那么任务状态又会变成PENDING。这在设计上是个巨大的问题,使用时要做对应容错。

常见控制操作

干货:基于Redis配置Celery任务(附源码)

有时,在业务主进程中需要等待异步运行的结果,这时需要使用wait。如果要取消一个排队中、或已执行的任务,则可以使用revoke。即使任务已经执行完成,也可以使用revoke,但不会有任何变化。如果需要提前删除任务记录,可以使用forget。
责编AJX

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Web
    Web
    +关注

    关注

    2

    文章

    1263

    浏览量

    69451
  • 分布式
    +关注

    关注

    1

    文章

    895

    浏览量

    74501
  • Redis
    +关注

    关注

    0

    文章

    374

    浏览量

    10871
收藏 人收藏

    评论

    相关推荐

    redis集群环境安装及配置

    redis集群主从配置
    发表于 03-08 09:59

    基于linux的安装和配置redis

    linux(centos)下安装、配置redis
    发表于 04-11 15:28

    阿里云ECS的redis配置步骤

    阿里云ECS配置redis
    发表于 10-28 08:28

    Mac上redis怎么安装配置

    Mac上redis基本安装配置及问题
    发表于 05-01 06:18

    启动Redis的三种方法

    Redis笔记(1)——安装、卸载、三种方法启动RedisRedis命令使用(干货十足),Redis两种方法设置密码,时间复杂度(更完善哦
    发表于 06-08 16:09

    走近源码Redis如何执行命令的

    走近源码Redis如何执行命令
    发表于 06-09 16:31

    【昉·星光 2 高性能RISC-V单板计算机体验】Redis源码编译和性能测试以及与树莓派4B对比

    本文首先介绍Redis是什么,然后介绍如何在VisionFive2上编译Redis源码,以及从源码安装Redis,最后介绍如何在Vision
    发表于 12-10 21:27

    【爱芯派 Pro 开发板试用体验】Redis源码编译和基准测试

    本文首先介绍Redis是什么,然后介绍如何在爱芯派上编译Redis源码,以及从源码安装Redis,最后介绍如何在爱芯派上运行
    发表于 12-10 22:18

    蜂鸣器播放音乐设计与实现(源码

    蜂鸣器播放音乐设计与实现(源码
    发表于 04-24 11:00 90次下载
    蜂鸣器播放音乐设计与实现(<b class='flag-5'>附</b><b class='flag-5'>源码</b>)

    Schedule:简单实用的 Python 周期任务调度工具

    。 ** ** 2.当需要执行的定时任务有上百个的时候,Crontab的 管理就会特别不方便 。 ** 另外一个选择是 Celery,但是 Celery配置比较麻烦,如果你只是需
    的头像 发表于 10-30 11:18 679次阅读

    Celery Beat 的周期调度机制及实现原理

    Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,它是一个专注于实时处理的任务队列,同时也支持任务调度。 为了讲解 Celery Beat 的周期调度机制及实现原理,我
    的头像 发表于 10-31 15:24 703次阅读

    Crontab:简单实用的Python 周期任务调度工具

    ,Crontab 的 管理就会特别不方便 。 还有一个选择是 Celery,但是 Celery配置比较麻烦,如果你只是需要一个轻量级的调度工具,Celery 不会是一个好选择。 在
    的头像 发表于 11-01 09:40 743次阅读

    基于Django的Celery异步任务和定时任务的实战教程

    Django与Celery是基于Python进行Web后端开发的核心搭配,在运营开发(即面向企业内部)的场景中非常常见。 下面是基于Django的Celery异步任务和定时任务的实战教
    的头像 发表于 11-02 10:45 725次阅读
    基于Django的<b class='flag-5'>Celery</b>异步<b class='flag-5'>任务</b>和定时<b class='flag-5'>任务</b>的实战教程

    redis连接数配置多少合适

    Redis 是一款高性能的内存数据库,广泛应用于缓存、消息队列、会话存储等场景。在配置 Redis 连接数时,需要根据实际情况综合考虑一系列因素,如服务器硬件规格、业务负载、并发访问量、数据模型等
    的头像 发表于 12-04 11:31 1404次阅读

    云容器redis持久化配置

    丢失。 Redis提供了不同的持久化机制,可以根据需要进行配置。本文将详细介绍云容器中Redis的持久化配置及其相关配置项。 一、
    的头像 发表于 12-05 10:07 510次阅读