項目結(jié)構(gòu)
在原先簡單的項目里使用 Celery 是比較隨意簡單的,但是在改進了項目結(jié)構(gòu)后,加上 Celery 和 Docker 就不一樣了。我的項目結(jié)構(gòu)是
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
...
創(chuàng)建 Celery 實例
項目需要使用 celery.task 作為裝飾器使用,就必須創(chuàng)建一個全局的 celery 對象。在項目根目錄下的 __init__.py (即創(chuàng)建 create_app 的地方)創(chuàng)建并配置 celery。配置 broker/backend 等等都在 settings.py 中,broker 必須要在 createa_app 之前創(chuàng)建,所以現(xiàn)在的缺點就是不能配置不同的 broker
from . import settings
from celery import Celery
celery = Celery(__name__, broker=settings.CELERY_BROKER_URL)
def create_app():
celery.conf.update(app.config)
# ...
創(chuàng)建 task, worker
將詳細(xì)任務(wù)寫在 tesks.py 中,方法當(dāng)然加上 @celery.task 裝飾器。接著就是創(chuàng)建一個 worker,worker 進程必須有自己的 Flask 實例,才能有上下文環(huán)境去執(zhí)行 task。所以創(chuàng)建一個單獨的腳本 celery_worker.py
#!/usr/bin/env python
from manage_risk import celery, create_app
app = create_app()
app.app_context().push()
Docker 部署
到此,已經(jīng)可以通過 celery worker -A celery_worker.celery --loglevel=info 啟動 celery。通過 Docker 部署的話,只要在 Dockerfile 的 CMD 加上執(zhí)行語句就行了,多條執(zhí)行語句之間加上 &&
FROM python:3.6
# ...
CMD gunicorn app:app -c ./gunicorn.conf.py && celery worker -A celery_worker.celery --loglevel=info