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. Linux连接Windows服务器以及文件传输方法

    Ubantu系统上连接Windows服务器,操作步骤 安装rdesktop sudo apt-get install rdesktop 连接命令 rdesktop -f IP -r disk:mydi ...

  2. SpringCloud之配置中心(config)的使用Git+数据库实现

    SpringCloud微服务实战系列教程 -------------------------目录------------------------------ 一.配置中心应用(Git) 二.配置中心的 ...

  3. 缓冲区溢出分析第10课:Winamp缓冲区溢出研究

    前言 Winamp是一款非常经典的音乐播放软件,它于上世纪九十年代后期问世.与现在音乐播放软件行业百家争鸣的情况不同,当时可以说Winamp就是听音乐的唯一选择了,相信那个时代的电脑玩家是深有体会的. ...

  4. hdu5256序列变换(非递减子序列)

    题意(中文直接粘吧)序列变换 Problem Description     我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无论是修改前还是修改后,每个元 ...

  5. mybatis常用功能总结

    mybatis-plus常用功能总结-以User表为例 1.数据库 id name age email create_time update_time version deleted 1 mary 2 ...

  6. FlinkSQL使用自定义UDTF函数行转列-IK分词器

    一.背景说明 本文基于IK分词器,自定义一个UDTF(Table Functions),实现类似Hive的explode行转列的效果,以此来简明开发过程. 如下图Flink三层API接口中,Table ...

  7. 通过例子分析MVVM

    通过一个简单的计数器例子分析MVVM. 代码 demo2.html <!DOCTYPE html> <html lang="en"> <head> ...

  8. 【maven和jdk】报错:系统找不到指定的文件

    创建一个maven项目出错 问题描述 在idea.log出现如下错误(系统找不到指定的文件,但是不知道指定文件是什么) com.intellij.execution.process.ProcessNo ...

  9. 容器环境下如何将NuGet包XML文档添加到Swagger

    容器环境下将NuGet包XML文档添加到Swagger 在.NET Core项目开发过程中,为了实现代码复用,我们将可以重复使用的部分拆分成一个个小的NuGet包.这些NuGet包可以在其他系统中复用 ...

  10. laravel 伪静态实现

    Route::get('show{id}.html',['as'=>'products.detail','uses'=>'companyController@show']) ->wh ...