1.异步框架示意图

2.celery 官方文档

http://docs.celeryproject.org/en/latest/index.html

3.启动celery的命令

启动 sender

自动检测

celery -A app beat -l info

启动worker

自动检测

celery -A app worker  -l info
4.broker和backend

broker(任务存储)和backend(结果存储)都是用的是rmq,backend中的数据会有自动过期机制,1小时后结果将自动过期(可以任意修改)。

5.架构设计

1.发送任务

所有的复杂逻辑都在发送端进行处理,将需要执行的任务序列确定好后,放入rmq中,不考虑在rmq上有什么复杂操作。 暂时只用一个docker,将所有的异步任务都放到rmq中。

2.执行任务

执行任务只是简单的运行具体的函数比如发送邮件之类,从rmq 中获取到该worker相对应的任务直接执行,逻辑较为简单。可以根据任务的数量动态的增减docker的数目。一类任务是一个task.py文件,相当于任务之间相互隔离,每个worker只执行特定的一种任务。

3.获取任务结果

提交任务后会返回任务的唯一id,需要主动去根据任务id获取执行结果。要把任务id和一些必要信息存在mysql中。检查逻辑应该跟具体任务来设计,会关联到不同的事件。

发送邮件任务

1.celery的配置

1.1beat端

启动命令

Python

# 启动timed 命令
celery -A mtk_celery.cel worker -l info -c 1 -Q timed
# 启动job 命令
celery -A mtk_celery.cel worker -l info -Q job
# 启动beat命令
celery -A mtk_celery.cel beat -l info
# celery 路由设置
# -c 指定 worker 数目
# -Q 指定 队列类型
# 需要启动两种不同的执行者 timed 类型 只能启动一个worker , job 类型没有限制
 
celery路由相当于给不同任务分组,给不同类型的任务指定不同的queue,启动时带上参数q,该worker,会只完成该queue中的异步任务
task_routes = {'mtk_celery.task': {'queue': 'job'},
'mtk_celery.edm_timed': {'queue': 'timed'},
'mtk_celery.edm_jobs': {'queue': 'job'}
}

celery定时任务 配置

Python

# 定义定时任务
beat_schedule = {
'edm_timed': {
# 具体需要执行的函数
# 该函数必须要使用@app.task装饰
'task': 'mtk_celery.edm_timed',
# 定时时间
# 每分钟执行一次,不能为小数
'schedule': crontab(minute='*/10'),
# 或者这么写,每小时执行一次
# "schedule": crontab(minute=0, hour="*/1")
# 执行的函数需要的参数
'args': ()
}
}
# 将定时任务加入beat中
cel.conf.update(
result_expires=3600 * 2,
beat_schedule=beat_schedule,
task_routes=task_routes
)
 

2.worker端

2.1 timed端

将需要执行的任务指定在配置中,启动beat 即可,timed 会捕获到该任务进行执行,由于会有并发冲突,可能会读取到同一个edm,所以单独拆分出来,该worker只拥有一个,保证不会出现线程不安全问题。

2.2 send端

不存在并发线程不安全问题,直接启动多个处理端发送即可。

celery异步任务体系笔记的更多相关文章

  1. Django商城项目笔记No.6用户部分-注册接口-短信验证码实现celery异步

    Django商城项目笔记No.4用户部分-注册接口-短信验证码实现celery异步 接上一篇,如何解决前后端请求跨域问题? 首先想一下,为什么图片验证码请求的也是后端的api.meiduo.site: ...

  2. Django使用Celery异步任务队列

    1  Celery简介 Celery是异步任务队列,可以独立于主进程运行,在主进程退出后,也不影响队列中的任务执行. 任务执行异常退出,重新启动后,会继续执行队列中的其他任务,同时可以缓存停止期间接收 ...

  3. Celery 异步任务 , 定时任务 , 周期任务 的芹菜

    1.什么是Celery?Celery 是芹菜Celery 是基于Python实现的模块, 用于执行异步定时周期任务的其结构的组成是由    1.用户任务 app    2.管道 broker 用于存储 ...

  4. Django --- celery异步任务与RabbitMQ模块

    一 RabbitMQ 和 celery 1 celery Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务, ...

  5. python—Celery异步分布式

    python—Celery异步分布式 Celery  是一个python开发的异步分布式任务调度模块,是一个消息传输的中间件,可以理解为一个邮箱,每当应用程序调用celery的异步任务时,会向brok ...

  6. Celery异步任务重复执行(Redis as broker)

    之前讲到利用celery异步处理一些耗时或者耗资源的任务,但是近来分析数据的时候发现一个奇怪的现象,即是某些数据重复了,自然想到是异步任务重复执行了. 查阅之后发现,到如果一个任务太耗时,任务完成时间 ...

  7. Django之使用celery异步完成发送验证码

    使用celery的目的:将项目中耗时的操作放入一个新的进程实现 1.安装celery pip install celery 2.在项目的文件夹下创建包celery_tasks用于保存celery异步任 ...

  8. celery异步任务、定时任务

    阅读目录 一 什么是Celery? 二 Celery的使用场景 三 Celery的安装配置 四 Celery异步任务 五Celery定时任务 六在Django中使用Celery   一 什么是Cele ...

  9. celery异步发送邮件

    利用Django框架发送邮件的详细过程,在前两天的博客中有所记录,但是单纯的那样发邮件是有非常大的问题的,这就需要celery异步发送来解决 首先我们来看一下邮件发送的过程: Django网站先发送到 ...

随机推荐

  1. Python 元编程 - 装饰器

    Python 中提供了一个叫装饰器的特性,用于在不改变原始对象的情况下,增加新功能或行为. 这也属于 Python "元编程" 的一部分,在编译时一个对象去试图修改另一个对象的信息 ...

  2. 【缓存池】转-Mysql参数innodb_buffer_pool_size

    转自:https://blog.csdn.net/kk185800961/article/details/79378313/ 以下考虑主要为 Innodb 引擎 [ innodb_buffer_poo ...

  3. hdu4496并查集的删边操作

    题意:       给你一个图,问你删除一些边后还有几个连通快.. 思路:       典型的并查集删边操作,并查集的删边就是先把不删除的边并查集一边(本题没有不删除的边),然后逆序吧所有要删除的边以 ...

  4. 【python】Leetcode每日一题-打家劫舍2

    [python]Leetcode每日一题-打家劫舍2 [题目描述] 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋 ...

  5. ConcurrentHashMap源码解读一

    最近在学习并发map的源码,如果由错误欢迎指出.这仅供我自己学习记录使用. 首先就先来说一下几个全局变量 private static final int MAXIMUM_CAPACITY = 1 & ...

  6. 软件测试中的测试用例Test Case原来是这么回事!

    如果你去找一份功能测试的工作,在软件测试工程师面试过程中,有一些面试官会来一两个非常简单的问题 什么是Test Case?你是如何去写Test Case的? 我们先来看一下测试用例的介绍 什么是测试用 ...

  7. 多线程-4.wait() notify() notifyAll() 生产者消费者模型

    1.wait()方法 该方法继承于Object类.在调用obj.wait()方法后,当前线程会失去obj的锁.待其他线程调用obj.notify()或notifyAll()方法后进入锁等待池,争抢到锁 ...

  8. 【BUAA软工】技术规格说明书

    项目 内容 班级:北航2020春软件工程 博客园班级博客 作业:技术规格说明书 技术规格说明书 宏观技术 后端 WEB服务器 WEB服务器选取的是Springboot,作为当下Java语言最主流的WE ...

  9. Jenkins 基础篇 - 任务分类

    从前面的小节中我们看到在创建 Jenkins 任务的时候有好几种类型,如果你专门安装了 Maven 相关插件,可能还会有一个[构建一个 maven 项目]的任务类型,那这些任务类型究竟有何区别,以及我 ...

  10. Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/collect/ImmutableMap

    selenium + java + mac + idea 报错分析: 网上搜的教程,配置selenium 自动化测试环境,都是只让导入 client-combined-3.141.59-sources ...