起因:项目中按照
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天终于完成了.......
共同学习,写下你的评论
评论加载中...
作者其他优质文章