zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    hdu 4027 Can you answer these queries?
    hdu 4041 Eliminate Witches!
    hdu 4036 Rolling Hongshu
    pku 2828 Buy Tickets
    hdu 4016 Magic Bitwise And Operation
    pku2886 Who Gets the Most Candies?(线段树+反素数打表)
    hdu 4039 The Social Network
    hdu 4023 Game
    苹果官方指南:Cocoa框架(2)(非原创)
    cocos2d 中 CCNode and CCAction
  • 原文地址:https://www.cnblogs.com/louyifei0824/p/10040639.html
Copyright © 2011-2022 走看看