起因:项目中按照
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天终于完成了.......
共同學習,寫下你的評論
評論加載中...
作者其他優質文章