django + celery实现定时任务
由于django-celery支持的celery版本最高到4.0,更高的版本的celery已实现了django-celery的功能,不再需要再安装django-celery了
broker使用的是redis,毕竟系统已经使用了redis做缓存了,不想再去安装个mq
下面来说说celery5.1.2搭配django3.0 + redis3.5.3的配置:
# 先在django项目的setting文件里面设置本地时区(如果不设置,它会使用国际时区) CELERY_TIMEZONE = 'Asia/Shanghai' CELERY_ENABLE_UTC = False
# 在django项目setting文件的同级目录下建一个celery.py文件 from __future__ import absolute_import, unicode_literals # 保证 celery.py不和library冲突 import logging import os from celery import Celery from celery.schedules import crontab logger = logging.getLogger() # 指定Django默认配置文件模块 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'take_out.settings') # 为项目创建一个Celery实例。这里不指定broker容易出现错误。 app = Celery('take_out', broker='redis://127.0.0.1:6379/4', backend='redis://127.0.0.1:6379/5') # 这里指定从django的settings.py里读取celery配置 app.config_from_object('django.conf:settings', namespace='CELERY') # 自动从所有已注册的django app中加载任务 app.autodiscover_tasks() app.conf.update( CELERYBEAT_SCHEDULE={ 'del_goods': { 'task': 'commerce_app.tasks.del_goods', 'schedule': crontab(minute=0, hour=4), # 每天凌晨4点钟执行一次删除商品 'args': (), }, 'send_message': { 'task': 'wechat_app.tasks.send_batch_msg', 'schedule': crontab(minute=5, hour=11), # 每天中午11点05分执行一次群发消息 'args': (), } } )
在需要定时任务的app下新建一个tasks.py文件,同时写好定时任务
commerce_app的下tasks.py文件下的定时任务
import logging from celery import shared_task import datetime from commerce_app.models import RecommendGoods logger = logging.getLogger() @shared_task def del_goods(): """ 定时删除超过30天的商品 """ # 30天前的今天 dle_day = datetime.datetime.now() + datetime.timedelta(days=-30) RecommendGoods.objects.filter(state_num=1, create_time__lt=dle_day).update(state_num=3)
wechat_app下的定时任务
import logging from celery import shared_task from wechatpy import WeChatClient logger = logging.getLogger() @shared_task def send_batch_msg(): """ 定时-给微信公众号的关注人员群发消息 """ client = WeChatClient('WX_APP_ID', 'WX_APP_SECRET') content = '欢迎关注"算联多优惠神器"公众号' client.message.send_mass_text(None, content, is_to_all=True)
windows下执行:
# 需要安装gevent依赖包: pip install gevent # 运行django项目 # 同时在django项目的manage.py文件的同级目录下运行两个cmd窗口分别执行以下两个命令: Celery -A take_out worker -l info -P gevent Celery -A take_out beat -l info
centos 下执行:
# 先安装进程守护 supervisor yum install supervisor # 设置开机启动 systemctl enable supervisord.service # 此时会生成 supervisor 配置文件:/etc/supervisord.conf 和 supervisor配置文件目录 /etc/supervisord.d,后面写的配置文件就放在supervisord.d文件夹下 # 这样启动 supervisor 后会 启动 /etc/supervisord.d 文件夹下以 .ini 为后缀的文件中的进程命令 # 先认识一下supervisor的命令 # 启动,会启动所有/etc/supervisord.d文件夹下面的进程命令 systemctl start supervisord.service # 停止 systemctl stop supervisord.service # 重启 systemctl restart supervisord.service # 更新新的配置 supervisorctl update # 在/etc/supervisord.d 文件夹下写一下celery心跳配置文件:celery_beat.ini [program:CeleryBeat] directory=/data/wwwroot/take_out ; 命令执行的目录 command=/data/env/take_out/bin/celery -A take_out beat --loglevel=info ; 执行的命令(需要加上项目虚拟环境的bin目录位置,不然找不到) autostart=true ; 是否自启动 autorestart=true ; 是否自动重启 startsecs=3 ; 自动重启时间间隔(s) stderr_logfile=/data/celery_log/celeryBeatErr.log ; 错误日志文件 stdout_logfile=/data/celery_log/celeryBeatOut.log ; 输出日志文件 # 在/etc/supervisord.d 文件夹下写一下work配置文件:celery_work.ini [program:CeleryWork] directory=/data/wwwroot/take_out ; 命令执行的目录 command=/data/env/take_out/bin/celery -A take_out worker --loglevel=info ; 执行的命令(需要加上虚拟环境的bin目录位置,不然找不到) autostart=true ; 是否自启动 autorestart=true ; 是否自动重启 startsecs=3 ; 自动重启时间间隔(s) stderr_logfile=/data/celery_log/celeryWorkErr.log ; 错误日志文件 stdout_logfile=/data/celery_log/celeryWorkOut.log ; 输出日志文件
弄好后重启django项目,然后启动supervisor即可
systemctl start supervisord.service
微信搜索公众号“算联多优惠神器”,每天都可以领取美团、饿了么的红包优惠券,还有京东、淘宝、拼多多的购物优惠券,更有景区特价门票、动车飞机特价票!!!