项目结构
在原先简单的项目里使用 Celery
是比较随意简单的,但是在改进了项目结构后,加上 Celery
和 Docker
就不一样了。我的项目结构是
app.py
celery_worker.py
Dockerfile
gunicorn.conf.py
app/
__init__.py
db.py
settings.py
tasks.py
auth/
__init__.py
handler.py
models.py
blog/
__init__.py
handler.py
models.py
...
创建 Celery 实例
项目需要使用 celery.task
作为装饰器使用,就必须创建一个全局的 celery
对象。在项目根目录下的 __init__.py
(即创建 create_app
的地方)创建并配置 celery。配置 broker/backend 等等都在 settings.py
中,broker
必须要在 createa_app
之前创建,所以现在的缺点就是不能配置不同的 broker
from . import settings
from celery import Celery
celery = Celery(__name__, broker=settings.CELERY_BROKER_URL)
def create_app():
celery.conf.update(app.config)
# ...
创建 task, worker
将详细任务写在 tesks.py
中,方法当然加上 @celery.task
装饰器。接着就是创建一个 worker
,worker
进程必须有自己的 Flask
实例,才能有上下文环境去执行 task
。所以创建一个单独的脚本 celery_worker.py
#!/usr/bin/env python
from manage_risk import celery, create_app
app = create_app()
app.app_context().push()
Docker 部署
到此,已经可以通过 celery worker -A celery_worker.celery --loglevel=info
启动 celery。通过 Docker
部署的话,只要在 Dockerfile
的 CMD
加上执行语句就行了,多条执行语句之间加上 &&
FROM python:3.6
# ...
CMD gunicorn app:app -c ./gunicorn.conf.py && celery worker -A celery_worker.celery --loglevel=info
网友评论