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

Flask+Celery 作为守护进程

Flask+Celery 作为守护进程

临摹微笑 2021-11-16 10:38:49
我尝试使用 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 Flaskfrom flask_restful import Api, Resourcefrom celery import Celerycelery = 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}"}, 200api.add_resource(add_zahl, "/add")if __name__ == '__main__':    app.run(host="0.0.0.0", debug=True)工人:tasks.pyfrom celery import Celeryimport requestsimport timeimport osfrom dotenv import load_dotenvbasedir = 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 resultif __name__ == '__main__':    celery.start()Dockerfile:FROM python:3.6-slimRUN mkdir /workerCOPY requirements.txt /worker/RUN pip install --no-cache-dir -r /worker/requirements.txtCOPY . /worker/COPY celeryd /etc/init.d/celerydRUN chmod +x /etc/init.d/celerydCOPY celeryd.conf /etc/default/celerydRUN chown root:root /etc/default/celerydRUN useradd -N -M --system -s /bin/bash celeryRUN addgroup celeryRUN adduser celery celeryRUN mkdir -p /var/run/celeryRUN mkdir -p /var/log/celeryRUN chown -R celery:celery /var/run/celeryRUN chown -R celery:celery /var/log/celeryRUN chmod u+x /worker/start.shENTRYPOINT /worker/start.sh
查看完整描述

2 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

每当 Docker 容器的入口点退出(或者,如果您没有入口点,则为它的主命令),容器就会退出。其推论是容器中的主进程不能是这样的命令celery multi,它会产生一些后台工作并立即返回;您需要使用celery worker在前台运行的命令。

我可能会将您的最后几行替换为Dockerfile

CMD ["celery", "worker", "--app=worker.tasks:celery"]

保留入口点脚本并将其更改为等效的前台celery worker命令也应该可以完成这项工作。


查看完整回答
反对 回复 2021-11-16
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

您还可以使用 supervisord 来运行您的 celery worker。如果出现问题,supervisord 还将监视并重新启动您的工作人员。以下是我为您的情况提取的工作图像的示例...


文件 supervisord.conf

[supervisord]

nodaemon=true


[program:celery]

command=celery worker -A proj --loglevel=INFO

directory=/path/to/project

user=nobody

numprocs=1

stdout_logfile=/var/log/celery/worker.log

stderr_logfile=/var/log/celery/worker.log

autostart=true

autorestart=true

startsecs=10

stopwaitsecs = 600

stopasgroup=true

priority=1000

文件 start.sh

#!/bin/bash

set -e

exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf

文件 Dockerfile

# Your other Dockerfile content here


ENTRYPOINT ["/entrypoint.sh"]

CMD ["/start.sh"]


查看完整回答
反对 回复 2021-11-16
  • 2 回答
  • 0 关注
  • 261 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信