Flask 工廠模式使用 Celery

項目結(jié)構(gòu)

在原先簡單的項目里使用 Celery 是比較隨意簡單的,但是在改進了項目結(jié)構(gòu)后,加上 CeleryDocker 就不一樣了。我的項目結(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 部署的話,只要在 DockerfileCMD 加上執(zhí)行語句就行了,多條執(zhí)行語句之間加上 &&

FROM python:3.6

# ...
CMD gunicorn app:app -c ./gunicorn.conf.py && celery worker -A celery_worker.celery --loglevel=info

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容