我的Django应用程序未启动Celery工人

时间:2018-08-04 02:17:53

标签: django celery gunicorn supervisor

我正在将DigitalOcean与Ubuntu 16.04一起使用,并安装了Django 2.0.5Python 3.5

这是我的文件结构:

/home/user/
 |--project-folder
     |--myproject
         |--init.py
         |--celery.py
         |--settings.py
         |--tasks.py
         |--wsgi.py             
     |--manage.py
     |--requirements.py
 |--gunicorn_start(executable)
 |--logs
 |--run
     |-- gunicorn.sock
 |--venv(virtual environment)
     |--bin
     |--lib

我的init.py文件:

from .celery import app as celery_app

我的celery.py文件

import os
from celery import Celery
from django.conf import settings

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

app = Celery('myproject')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

我的settings.py文件中的芹菜节

CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

我安装了 Gunicorn ,这是我的 gunicorn_start 文件

#!/bin/bash

NAME="myproject"
DIR=/home/user/project-folder
USER=user
GROUP=user
WORKERS=3
BIND=unix:/home/user/run/gunicorn.sock
DJANGO_SETTINGS_MODULE=myproject.settings
DJANGO_WSGI_MODULE=myproject.wsgi
LOG_LEVEL=error

cd $DIR
source ../venv/bin/activate

export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DIR:$PYTHONPATH

exec ../venv/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $WORKERS \
  --user=$USER \
  --group=$GROUP \
  --bind=$BIND \
  --log-level=$LOG_LEVEL \
  --log-file=-

我安装了 Supervisor ,这是我的 /etc/supervisor/conf.d/a-name.conf 文件:

[program:myproject]
command=/home/user/gunicorn_start
user=user
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/home/user/logs/gunicorn.log

我使用.delay()调用任务(电子邮件功能),但没有发送电子邮件,然后在终端上使用以下命令让工作人员运行:

celery -A myproject worker -l info

,所有电子邮件均已发送。

一旦我按下Ctrl-C或关闭终端,工人就会停止运行。 我的文件设置有问题吗?如果需要其他信息,请告诉我

1 个答案:

答案 0 :(得分:0)

就是这样。当您使用 .delay() 调用celery任务时,它将添加到 celery队列。这并不意味着任务正在执行/执行。此任务将由尚未开始的芹菜工作者执行

因此,当您使用celery -A myproject worker -l info命令启动celery worker时,它开始从 queue 队列执行任务。

处理芹菜时,首先必须启动芹菜工作者,然后启动gunicorn或django服务器