为了账号安全,请及时绑定邮箱和手机立即绑定

Django 2.1 celery supervisor 采坑指南

标签:
Django

起因:项目中按照

Django开发企业实战 面向就业/升职(中高级教程)

配置了celery任务,但是基于djcelery的,觉得邮件只能从django配置的邮箱中发出有点不够灵活,就用了yagmail,并添加了任务,测试时发送邮件完全没有问题,但是用supervisor运行就死活找不到yagmail包,气得不行,以为是这个包被做了手脚,就直接把包下载到本地,但是其中引用的包还是找不到,其实这时

https://blog.csdn.net/qq_39314099/article/details/98759306

这篇文章就能解决问题。

当时觉得可能是celery版本不对,就不用djcelery的 celery版本,然后整个重写了celery部分

在项目文件夹下建立 celery_task 包,包含3个文件

my_celery.py

from celery import Celery

# 加载django环境,否则无法使用Django的model或其他内容
import os
import django
import sys
# 查找上级文件。否则项目的.settings文件是找不到的
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)


os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Jcompass0711.settings")
django.setup()

broker='redis://127.0.0.1:6379/1'
backend='redis://127.0.0.1:6379/2'

app=Celery('Jcompass0711',broker=broker,backend=backend,include=['celery_task.tasks',])

#celery配置放到celeryconfig.py中
app.config_from_object('celery_task.celeryconfig',namespace='CELERY')

# 执行定时任务
# 时区
app.conf.timezone = 'Asia/Shanghai'
# 是否使用UTC
app.conf.enable_utc = False

# 任务的定时配置
from datetime import timedelta
from celery.schedules import crontab

app.conf.beat_schedule = {
    # 'task1': {
    #     'task': 'celery_task.tasks.update_warehous_sent2invoicing',
    #     'schedule': timedelta(seconds=30), # 定时30秒执行刷新任务,将数据库中的数据缓存到Redis中
    # },
    'task3':{
            'task': 'celery_task.tasks.po_remind_email',
            'schedule': crontab(day_of_week='tue',hour='8',minute='30'),
            # 'args':{},
            # 'options': {
            #     'queue': 'beat_tasks'
            # }
        },
    # 'task3':{
    #         'task': 'PO-order-reminder-weekly-task',
    #         'schedule': crontab(day_of_week='5',hour='18',minute='11'),
    #         'args':{},
    #         'options': {
    #             'queue': 'beat_tasks'
    #         }
    #     }
}

task.py  需要执行的任务,放到my_celery中调用

from .my_celery import app

from utils.Email.send_purchase_remind_email import YagmailPO_info_remind_email

@app.task
def po_remind_email():
    YagmailPO_info_remind_email(['violet', 'kelly', 'stacy']) #已OK

    return print("job Done")

celeryconfig.py 放celery相关配置,没有放到setting中,前面引入setting其实没有必要

# 避免死锁
CELERYD_FORCE_EXECV = True

#设置并发worker数量

worker_concurrency = 1

#允许重试
CELERYD_ACKS_LATE = True

#多少此任务后worker销毁,避免内存泄漏
worker_max_tasks_per_child = 500

# 最大运行时间
task_time_limit = 12*30

task_queues ={
    'beat_tasks': {
        'exchange': 'beat_tasks',
        'exchange_type': 'direct',
        'binging_key':'beat_tasks'
    },
    'work_queue': {
        'exchange': 'work_queue',
        'exchange_type': 'direct',
        'binging_key': 'work_queue'
    }
}
task_default_queue = 'work_queue'

重点来了,改完之后在centos终端中运行启动celery和celery beat是没有问题的,任务能正常执行(要进入虚拟环境)

#启动woker,这个命令要在项目总文件夹下,和manage.py 同级
celery -A celery_task.my_celery worker -l INFO

celery -A mcelery_task.my_celery beat -l INFO

但在supervisor下执行却总是

Unknown command: 'celery'

Type 'manage.py help' for usage.

原来我改的supervisor启动配置文件是项目本地的,而supervisor读取的是 /etc/supervisor.d/conf/ 下的文件

[program: test-celery-worker]  
#这里要写celery命令的完整路径,否则找不到,beat的也差不多
command =/root/.virtualenvs/jcompass/bin/celery -A celery_task.my_celery worker -l INFO  
directory = /home/jcompass08
enviroment = PATH ="/root/.virtualenvs/jcompass"
stdout_logfile = /home/jcompass08/logs/celery.worker.log
stderr_logfile =  /home/jcompass08/logs/celery.worker_error.log
stopwatisecs = 60
priority = 98

改完一定要

[root@zanhu nginx+uwsgi+daphne+supervisor]# supervisorctl update [root@zanhu nginx+uwsgi+daphne+supervisor]# supervisorctl reload

直接restart supervisor是不会重读配置文件的

折腾了2天终于完成了.......


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消