• django-celery的配置及使用


    Celery简介

    Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理

    celery的应用

    异步调用:那些用户不关心的但是又存在在我们API里面的操作 我们就可以用异步调用的方式来优化(发送邮件 或者上传头像)

    ​定时任务:定期去统计日志,数据备份,或者其他的统计任务

    相关概念

    task:需要执行的任务

    worker:负责干活的小弟们

    broker:结果存放的位置

    celery的安装和使用

    pip install celery
    pip install celery-with-redis
    pip install django-celery
    apt install redis-server
    安装

    配置

    ALLOWED_HOSTS = ['*']
    INSTALLED_APPS = (
          ...
          'djcelery',
    ‘自己的APP’
        }
    import djcelery
    djcelery.setup_loader()
    BROKER_URL='redis://localhost:6379/1'
    CELERY_CONCURRENCY=2(设置worker的并发数量)
    CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'
    settings.py文件

    settings.py的同级目录下新建celery.py

    from __future__ import absolute_import #绝对路径导入
    from celery import Celery
    from django.conf import settings
    import os
    
    #设置系统的环境配置用的是Django的
    os.environ.setdefault("DJANGO_SETTING_MODULE", "工程名字.settings")
    
    #实例化celery
    app = Celery('mycelery')
    
    app.conf.timezone = "Asia/Shanghai"
    
    #指定celery的配置来源 用的是项目的配置文件settings.py
    app.config_from_object("django.conf:settings")
    
    #让celery 自动去发现我们的任务(task)
    app.autodiscover_tasks(lambda : settings.INSTALLED_APPS) #你需要在app目录下 新建一个叫tasks.py(一定不要写错)文件
    celery.py

    settings.py同级目录下的init.py加入

    from __future__ import absolute_import, unicode_literals
    from .celery import app as celery_app
    __init__.py

    使用

    1、在需要使用异步任务的APP目录下新建tasks.py

    from celery import task
    import time
    
    @task
    def hello_celery(loop):
        for i in range(loop):
            print 'hello'
            time.sleep(2)
    tasks.py

    2、views.py内的调用

    任务函数名.delay(参数,,,,)

    3、python manage.py migrate 建表(不要忘记建表)

    4、启动worker

    python manage.py celery worker --loglevel=info (或者celery -A 你的工程名 worker -l info)

    注意:修改tasks.py的内容后 要重启celery的服务(命令:python manage.py celery worker --loglevel=info)

    定时任务

    在settings.py文件添加
    CELERYBEAT_SCHEDULE = {
        'schedule-test': {
            'task': 'app的名字.tasks.hello_celery',
            'schedule': timedelta(seconds=3),
            'args': (2,)
        },
    
    }
    settings.py

    启动: celery -A 你的工程名称 beat -l info(或者python manage.py celery beat --loglevel=info)

    计划任务时间

    from celery.schedules import crontab
    crontab(minute=u'00', hour=u'11',day_of_week='mon,tue,wed,thu,sun')
    
    示例如下:
     'every-week-three-and-four-run-get_data_with_param':{
            'task': 'APP的名字.tasks.get_data_with_param',
            'schedule': crontab(day_of_week="3, 4"),
            'args':(4, )
        }

    注意:

    我们启动定时任务服务时 也要先开启worker(python manage.py celery worker --loglevel=info)

    ​ 如果只开启定时服务 没有开启worker服务 那么定时任务会被放入任务队列,但是由于没有干活儿的worker 那么任务是不会被执行,当worker服务被启动后 会立刻去任务队列领任务并执行

    #<分钟> <小时> <日> <月份> <星期> <命令>
    
    */1    *    *    *    *    date>>a.txt
    
    #用date>>~/crontest可以很清楚的看到测试的效果
    
    5    *    *    *    *    ls
    
    #指定每小时的第5分钟执行一次ls命令
    
    30    5    *    *     *    ls
    
    #指定每天的 5:30 执行ls命令
    
    30    7    8    *    *    ls
    
    #指定每月8号的7:30分执行ls命令
    
    30    5    8    6    *    ls
    
    #指定每年的6月8日5:30执行ls命令
    
    30    6    *    *    0    ls
    
    #指定每星期日的6:30执行ls命令【注:0表示星期天,1表示星期1。星期也可以用英文来表示,sun表示星期天,mon表示星期一等。】
    
    30    3    10,20    *    *    ls
    
    #每月10号及20号的3:30执行ls命令【注:“,”用来连接多个不连续的时段】
    
    25    8-11    *    *    *    ls
    
    #每天8-11点的第25分钟执行ls命令【注:“-”用来连接连续的时段】
    
    */15    *    *    *    *    ls
    
    #每15分钟执行一次ls命令【即每个小时的第0 15 30 45 60分钟执行ls命令】
    
    30    6    */10    *    *    ls
    
    #每个月中,每隔10天6:30执行一次ls命令【即每月的1、11、21、31日是的6:30执行一次ls 命令。】
    
    50    7    *    *    *    root    run-parts    /etc/cron.daily
    
    #每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件【注:run-parts参数表示执行后面目录中的所有可执行文件。】
    
    重启服务 :/etc/init.d/cron restart
    
    计划是分用户的,只对当前用户显示
    
    */20 4 10,13 6-8 *
    计划任务

     如果上面的重启方式不成功, 重启任务: /sbin/service crond restart

  • 相关阅读:
    设计模式之建造者模式(简单)
    设计模式之简单工厂模式,工厂模式,抽象工厂模式
    设计模式之观察者模式
    Redis java操作客服端——jedis
    Redis基础
    java环境变量配置加maven配置
    设计模式之JDK动态代理
    springboot+mybatis+Thymeleaf
    OS问题管理系统开发
    复制CentOS虚拟机网络配置
  • 原文地址:https://www.cnblogs.com/louyifei0824/p/10040639.html
Copyright © 2020-2023  润新知