Celery

介绍:

  • Celery 是芹菜

    Celery 是基于Python实现的模块, 用于执行异步定时周期任务的

  • 其结构的组成是由

    1. 用户任务 app
    2. 管道 broker 用于存储任务 官方推荐 redis rabbitMQ / backend 用于存储任务执行结果的
    3. 员工 worker
  • 工作流程: (多任务 异步任务 )(生产者消费者模型)

    app -> task -> 调度器(broker) -> worker -> 调度器(backend) -> task -> app

  • 定时任务

    task -> 0:05分执行--调度器(broker) -> 0:05分执行--worker:等待 -> 调度器(backend) -> task

  • 周期任务

    task -> 每天0:05分执行--调度器(broker) -> 每天0:05分执行--worker: 每天等待 -> 调度器(backend) -> task

    task -> 每60秒执行--调度器(broker) -> 每60秒执行--worker: 每60秒等待 -> 调度器(backend) -> task

问题: window 下会用jing'chen

window 下运行需要安装 eventlet 包

异步任务

  • s1.py
import time

from celery import Celery

diaoduqi = Celery("mytask",broker="redis://127.0.0.1:6379",backend="redis://127.0.0.1:6379")

@diaoduqi.task
def ab(a,b):
time.sleep(15)
return a+b
  • s2.py (发布任务)
from 异步任务.s1 import ab

l = []
for i in range(5):
res = ab.delay(i+1,i*i)
l.append(res.id) print(l)
  • s3.py (取结果)
from celery.result import AsyncResult
from 异步任务.s1 import diaoduqi task_id = ['abd700c5-990a-496d-9a2b-28461518e8a0', '5fff40e6-a2d8-48c8-923f-8c2fe988ca77', '9bfca50e-51f3-46a6-baf6-e4e786e0815d', '3d0aa849-bc51-4e74-a150-02a170bb8540', '8f806ae2-9f2f-4404-8c31-a7eeb86ced42']
for i in task_id :
a = AsyncResult(i,app=diaoduqi)
if a.successful():
print(a.get())
else:
print("任务还在执行中")
  • 开启命令:

    celery worker -A s1 -l INFO -P eventlet -c 10
    # -P eventlet 指定使用其他模块 线程执行
    # -c 10 指定workon 的数量

项目中使用

  • 目录结构
    • CeleryTask

      • celery.py
      • TaskOne.py
      • TaskTwo.py
    • 发布和获取的 py文件
  • celery.py

    from celery import Celery
    
    DDQ = Celery("DDQ", broker='redis://127.0.0.1:6379', backend='redis://127.0.0.1:6379'
    , include=['CeleryTask.TaskOne', 'CeleryTask.TaskTwo'])
  • TaskOne.py

    from CeleryTask.celery import DDQ
    
    import time
    
    @DDQ.task
    def one1():
    time.sleep(1)
    return 'one1' @DDQ.task
    def one2():
    time.sleep(2)
    return 'one2'
  • TaskTwo.py

    from CeleryTask.celery import DDQ
    import time @DDQ.task
    def two1():
    time.sleep(3)
    return 'two1' @DDQ.task
    def two2():
    time.sleep(4)
    return 'two2'
  • 发布 获取

    from CeleryTask.TaskOne import one1, one2
    from CeleryTask.TaskTwo import two1, two2 one1.delay()
    one2.delay()
    two1.delay()
    two2.delay()
    # one1.delay()
    from CeleryTask.celery import DDQ
    from celery.result import AsyncResult task_list = []
    for i in range(1, 50):
    res = one1.delay()
    task_list.append(res.id) print(task_list)
    while task_list: ok_task = []
    for task_id in task_list:
    a = AsyncResult(task_id, app=DDQ) if a.successful():
    print(a.get())
    # print()
    ok_task.append(a.id)
    # else:
    # print('还在执行中') [task_list.remove(x) for x in ok_task]
  • 启动命令:

    (Spider) F:\Cerery_demo>celery worker -A CeleryTask -l INFO -P eventlet -c 99
    # -A CeleryTask 指定目录 会自动寻找 celery.py 文件执行

定时任务

  • 使用apply_async定时执行
    from CeleryTask.celery import DDQ
    from celery.result import AsyncResult
    from CeleryTask.TaskOne import one1, one, one2
    from CeleryTask.TaskTwo import two1 as two, two2 # one1.delay()
    # one2.delay()
    # two1.delay()
    # two2.delay()
    # one1.delay() # one.delay(10,10)
    # two.delay(20,20) # 定时任务我们不在使用delay这个方法了,delay是立即交给task 去执行
    # 现在我们使用apply_async定时执行 # 首先我们要先给task一个执行任务的时间
    import datetime, time # 获取当前时间 此时间为东八区时间
    ctime = time.time()
    # 将当前的东八区时间改为 UTC时间 注意这里一定是UTC时间,没有其他说法
    utc_time = datetime.datetime.utcfromtimestamp(ctime)
    # 为当前时间增加 10 秒
    add_time = datetime.timedelta(seconds=20)
    action_time = utc_time + add_time # action_time 就是当前时间未来10秒之后的时间
    # 现在我们使用apply_async定时执行
    res = one.apply_async(args=(10, 10), eta=action_time)
    print(res.id)
    # 这样原本延迟5秒执行的One函数现在就要在10秒钟以后执行了
    [2019-05-14 13:43:34,434: INFO/MainProcess] Received task: CeleryTask.TaskOne.one[18483e45-6f99-4c8f-a7c3-9586218f0425]  ETA:[2019-05-14 05:43:54.374500+00:00]
    [2019-05-14 13:43:59,386: INFO/MainProcess] Task CeleryTask.TaskOne.one[18483e45-6f99-4c8f-a7c3-9586218f0425] succeeded in 5.0s: 100 # 13:43:34 发布 执行完城时间 13:43:59 任务中睡了5秒

周期任务

  • 在 celery 中配置

    from celery import Celery
    from celery.schedules import crontab DDQ = Celery("DDQ", broker='redis://127.0.0.1:6379', backend='redis://127.0.0.1:6379'
    , include=['CeleryTask.TaskOne', 'CeleryTask.TaskTwo'])
    # 我要要对beat任务生产做一个配置,这个配置的意思就是每10秒执行一次Celery_task.task_one任务参数是(10,10) DDQ.conf.beat_schedule = {
    "each10s_task": {
    "task": "CeleryTask.TaskOne.one",
    "schedule": 10, # 每10秒钟执行一次
    "args": (10, 10)
    },
    "each1m_task": {
    "task": "CeleryTask.TaskOne.one1",
    "schedule": crontab(minute=1), # 每一分钟执行一次
    # "args": (10, 10)
    },
    "each24hours_task": {
    "task": "CeleryTask.TaskOne.one",
    "schedule": crontab(hour=23), # 每24小时执行一次
    "args": (10, 10)
    } } # 以上配置完成之后,还有一点非常重要
    # 不能直接创建Worker了,因为我们要执行周期任务,所以首先要先有一个任务的生产方
    # celery beat -A CeleryTask
    # celery worker -A CeleryTask -l INFO -P eventlet
    • 生产者

      celery beat -A CeleryTask

    • 消费者

      celery worker -A CeleryTask -l INFO -P eventlet

Celery 异步任务的更多相关文章

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

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

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

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

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

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

  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网站先发送到 ...

  10. [Flask]celery异步任务队列的使用

    Celery异步任务队列 目录结构树: 配置文件config.py: # 设置中间人地址 broker_url = 'redis://127.0.0.1:6379/1' 主main.py: impor ...

随机推荐

  1. c# chart控件柱状图,改变柱子宽度

    让柱状图紧挨 改变柱状图宽度 chart1.Series[0]["PointWidth"] = "2";

  2. 49.Linux-wpa_cli使用之WIFI开启,扫描热点,连接热点,断开热点,WIFI关闭(49)

    本章学习内容: 1.WIFI如何开启 2.扫描热点 3.连接热点 4. 断开热点 5.关闭WIFI 本节使用的是wpa_supplicant工具,它主要包含wpa_supplicant(命令行模式)与 ...

  3. 22.QT-QXmlStreamReader解析,QXmlStreamWriter写入

    XML介绍 XML 用于存储数据,数据的形式类似于树结构(参考: http://www.runoob.com/xml/) 示例如下 <?xml version="1.0" e ...

  4. http协议、web服务器、并发服务器(上)

    目录 1. HTTP格式 1.1 HTTP GET请求的格式: 1.2 HTTP POST请求的格式: 1.3 HTTP响应的格式: 2. Web静态服务器-显示固定的页面 3. Web静态服务器-显 ...

  5. javascript算法-插入排序

    原理跟java那篇文章一样,只是语言不同而已 var InsertSort = function( _n ){ this.maxSize = _n; this.arr = []; this.init ...

  6. angular 动态取到的html片段 在页面的展示

    写个过滤器 xxx.filter( 'to_trusted', ['$sce', function ($sce) { return function (text) { return $sce.trus ...

  7. 苹果8plus怎么录屏视频

    现在越来越多的手机控,不管在什么地方,什么时候,都是低头看手机的居多,因为手机信息量太大了,一部手机就可以了解最新咨询,但是作为苹果8plus怎么录制手机屏幕,你们知道吗?今天就和大家一起分享苹果8p ...

  8. How To Do Master Record Mass Maintenance

    How To Do Master Record Mass Maintenance Which master records mass maintenance can be done? What do ...

  9. Python入门基础之条件判断、循环、dict和set

    Python之if语句 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,可以用if语句实现: age = 20 if age >= 18: print 'your age is ...

  10. 使用JDBC连接MySQL数据库的一个基本案例

    JDBC的概念(摘自百度百科) JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一 ...