Flask+Celery 作为守护进程

我尝试使用 Python Flask 并想使用 celery。分布式任务工作正常,但现在我想将它配置为守护进程,如芹菜文档中所述。但我得到了celery_worker_1 exited with code 0错误。


项目结构:


celery

|-- flask-app

|   `-- app.py

|-- worker

|   |-- celeryd

|   |-- celeryd.conf

|   |-- Dockerfile

|   |-- start.sh

|   `-- tasks.py

`-- docker-compose.yml

烧瓶应用程序/ app.py:


from flask import Flask

from flask_restful import Api, Resource


from celery import Celery


celery = Celery(

                'tasks',

                broker='redis://redis:6379',

                backend='redis://redis:6379'

)


app = Flask(__name__)

api = Api(app)


class add_zahl(Resource):

    def get(self):

        zahl = 54

        task = celery.send_task('mytasks.add', args=[zahl])


        return {'message': f"Prozess {task.id} gestartet, input {zahl}"}, 200


api.add_resource(add_zahl, "/add")


if __name__ == '__main__':

    app.run(host="0.0.0.0", debug=True)

工人:tasks.py


from celery import Celery

import requests

import time

import os

from dotenv import load_dotenv


basedir = os.path.abspath(os.path.dirname(__file__))

load_dotenv(os.path.join(basedir, '.env'))


celery = Celery(

                'tasks',

                broker='redis://redis:6379',

                backend='redis://redis:6379'

)


@celery.task(name='mytasks.add')

def send_simple_message(zahl):

    time.sleep(5)

    result = zahl * zahl

    return result


if __name__ == '__main__':

    celery.start()

Dockerfile:


FROM python:3.6-slim


RUN mkdir /worker

COPY requirements.txt /worker/

RUN pip install --no-cache-dir -r /worker/requirements.txt


COPY . /worker/


COPY celeryd /etc/init.d/celeryd

RUN chmod +x /etc/init.d/celeryd


COPY celeryd.conf /etc/default/celeryd

RUN chown root:root /etc/default/celeryd


RUN useradd -N -M --system -s /bin/bash celery

RUN addgroup celery

RUN adduser celery celery


RUN mkdir -p /var/run/celery

RUN mkdir -p /var/log/celery

RUN chown -R celery:celery /var/run/celery

RUN chown -R celery:celery /var/log/celery


RUN chmod u+x /worker/start.sh

ENTRYPOINT /worker/start.sh


临摹微笑
浏览 272回答 2
2回答

呼如林

每当 Docker 容器的入口点退出(或者,如果您没有入口点,则为它的主命令),容器就会退出。其推论是容器中的主进程不能是这样的命令celery multi,它会产生一些后台工作并立即返回;您需要使用celery worker在前台运行的命令。我可能会将您的最后几行替换为Dockerfile:CMD ["celery", "worker", "--app=worker.tasks:celery"]保留入口点脚本并将其更改为等效的前台celery worker命令也应该可以完成这项工作。

海绵宝宝撒

您还可以使用 supervisord 来运行您的 celery worker。如果出现问题,supervisord 还将监视并重新启动您的工作人员。以下是我为您的情况提取的工作图像的示例...文件 supervisord.conf[supervisord]nodaemon=true[program:celery]command=celery worker -A proj --loglevel=INFOdirectory=/path/to/projectuser=nobodynumprocs=1stdout_logfile=/var/log/celery/worker.logstderr_logfile=/var/log/celery/worker.logautostart=trueautorestart=truestartsecs=10stopwaitsecs = 600stopasgroup=truepriority=1000文件 start.sh#!/bin/bashset -eexec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf文件 Dockerfile# Your other Dockerfile content hereENTRYPOINT ["/entrypoint.sh"]CMD ["/start.sh"]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python