zoukankan      html  css  js  c++  java
  • Celery实现周期任务

      这个翻译之后居然叫芹菜~~最近Django框架需要涉及到执行周期任务~~上网搜了下其实还挺多的(django_crontab:这个学习周期短,但是发现不仅麻烦还不好用啊)、(apscheduler,简单还行在没完全掌握Celery时先用它顶了一段时间,但是需要注意不同版本的使用方法差别还挺大的),最后还是决定花时间来学学,Celery是Python语言实现的分布式队列服务,除了支持即时任务,还支持定时任务。

    Celery中的五个核心角色

    • Task

      任务(Task)就是你要做的事情,例如一个注册流程里面有很多任务,给用户发验证邮件就是一个任务,这种耗时任务可以交给Celery去处理,还有一种任务是定时任务,比如每天定时统计网站的注册人数,这个也可以交给Celery周期性的处理。

    • Broker

      Broker 的中文意思是经纪人,指为市场上买卖双方提供中介服务的人。在Celery中它介于生产者和消费者之间经纪人,这个角色相当于数据结构中的队列。例如一个Web系统中,生产者是处理核心业务的Web程序,业务中可能会产生一些耗时的任务,比如短信,生产者会将任务发送给 Broker,就是把这个任务暂时放到队列中,等待消费者来处理。消费者是 Worker,是专门用于执行任务的后台服务。Worker 将实时监控队列中是否有新的任务,如果有就拿出来进行处理。Celery 本身不提供队列服务,一般用 Redis 或者 RabbitMQ 来扮演 Broker 的角色

    • Worker

      Worker 就是那个一直在后台执行任务的人,也称为任务的消费者,它会实时地监控队列中有没有任务,如果有就立即取出来执行。

    • Beat

      Beat 是一个定时任务调度器,它会根据配置定时将任务发送给 Broker,等待 Worker 来消费。

    • Backend

      Backend 用于保存任务的执行结果,每个任务都有返回值,比如发送邮件的服务会告诉我们有没有发送成功,这个结果就是存在Backend中,当然我们并不总是要关心任务的执行结果。

                                                     

    入门操作

    1、安装(Celery4.x 开始不再支持Windows平台,如果需要在Windows开发,请使用3.x的版本)

    pip install celery==3.1.15

    2、创建一个实例

    # 创建一个Celery实例,broker是管道用于储存任务,官方推荐Redis、RabbitMQ;backend用于存储任务执行结果
    app = Celery("tasks", broker="redis://127.0.0.1:6379", backend='redis://127.0.0.1:6379')

     3、直接上代码(新建一个celery_task1目录,里面建下面两个py文件)

    #!/usr/bin/env python3
    # -*- encoding:utf-8 -*-
    """
    author:Barret
    mail:barret_vip@163.com
    """
    from celery import Celery
    import time
    
    # 创建Celery实例
    app = Celery('tasks', broker='redis://127.0.0.1:6379',
                          backend='redis://127.0.0.1:6379',
                 )
    app.conf.task_protocol = 1
    
    # 创建任务
    @app.task
    def add(x):
        time.sleep(1)
        print("开始任务了:%s" %x)
        return x
    celerys.py
    #!/usr/bin/env python3
    # -*- encoding:utf-8 -*-
    """
    author:Barret
    mail:barret_vip@163.com
    """
    from celery.result import AsyncResult
    import sys
    
    dir = r"D:	odaycelery_task1"
    sys.path.append(dir)  # 我的任务文件不在环境变量里,IDLE找不到
    from celerys import add
    reslut = add.delay(1)
    
    # 判断是否有值,get调用会阻塞
    print(reslut) # 可以查看id,也可以使用reslut.id获取id。
    
    # 异步获取任务返回值
    async_task = AsyncResult(id="45cf4a22-82d5-43f2-a0c9-8fd3af6b1136", app=add)
    
    # 判断异步任务是否执行成功
    if async_task.successful():
        r = reslut.get(propagate=False)  # 出现异常返回异常不触发异常
        print(r)
    else:
        print("任务还没执行完毕")
    cmd

    4、执行步骤(不建议直接在Django项目中创建,会出现报错)

    # 1、打开CMD或者Pycharm下的Terminal执行下面命令:
    celery -A celerys  worker -l info -P eventlet
    
    # 2、接着运行cmd.py即可打印结果

     结果出现这样的即运行成功:

    入门操作报错

    • BUG1:如果出现:AttributeError: 'str' object has no attribute 'items',则是redis版本过高(我安装的是3.x),安装2.10.6即可~(但是在我安装2.10之后又说我版本太低,但是当我重新装回3.x的时候又能用了~~~我只能说玄学好吧)

    •  BUG_2:如果出现下面这个报错解决办法是,在实例化Celery时添加下面配置项,这个好像是新协议问题,使用指定到旧协议。

    # 在app创建的时候指定
    CELERY_TASK_PROTOCOL = 1  # Django中使用这个
    app.conf.task_protocol = 1
    BUG_2:解决办法
    • BUG_3:如果想获取返回结果直接用get方式会报错,需要指定保存任务结果的位置。
    reslut.get()  # 会报错这里是实例化的时候,没有定义backend,就是保存任务结果的位置。

    • BUG_3解决:指定输出到,我这里还是指定到redis中。

    好吧我算是把各种报错都玩了个遍~~~~

    • BUG_4:在执行时又出现下面这个报错了
    Traceback (most recent call last):
      File "d:programmingsoftwarepython35libsite-packagesilliardpool.py", line 358, in workloop
        result = (True, prepare_result(fun(*args, **kwargs)))
      File "d:programmingsoftwarepython35libsite-packagesceleryapp	race.py", line 525, in _fast_trace_task
        tasks, accept, hostname = _loc
    ValueError: not enough values to unpack (expected 3, got 0)
    pip install eventlet # 安装一下
    celery -A task1 worker -l info -P eventlet # 将启动命令改成这个
    再去执行cmd.py就没问题了~~
    BUG_4:解决方法
    • 哇~~~~想哭一波三折终于看到输出了(这一步就代表初步使用没问题了,接下来我终于可以做周期任务了)

    在Django中使用Celery

    更新中..................

  • 相关阅读:
    一个简单XQuery查询的例子
    《Microsoft Sql server 2008 Internals》读书笔记第七章Special Storage(1)
    《Microsoft Sql server 2008 Internals》读书笔记第八章The Query Optimizer(4)
    《Microsoft Sql server 2008 Internal》读书笔记第七章Special Storage(4)
    SQL Server中SMO备份数据库进度条不显示?
    《Microsoft Sql server 2008 Internal》读书笔记第七章Special Storage(5)
    《Microsoft Sql server 2008 Internal》读书笔记第七章Special Storage(3)
    《Microsoft Sql server 2008 Internal》读书笔记第八章The Query Optimizer(2)
    省市三级联动的DropDownList+Ajax的三种框架(aspnet/Jquery/ExtJs)示例
    FireFox意外崩溃时的手工恢复命令
  • 原文地址:https://www.cnblogs.com/Dream-huang/p/10901076.html
Copyright © 2011-2022 走看看