> 本文首發於公眾號:Hunter後端 > 原文鏈接:[celery筆記二之建立celery項目、配置及幾種載入方式](https://mp.weixin.qq.com/s/KZjuypZ-e9EHi7XkKXt0Xg) 接下來我們創建一個 celery 項目,文件夾及目錄如下: ```python ...
本文首發於公眾號:Hunter後端
原文鏈接:celery筆記二之建立celery項目、配置及幾種載入方式
接下來我們創建一個 celery 項目,文件夾及目錄如下:
proj/__init__.py
/celery.py
/tasks1.py
/tasks2.py
接下來我們逐個文件向裡面添加內容。
1、項目文件內容及介紹
我們建立了一個名為 proj 的文件夾作為我們的項目文件夾,其下有兩個文件,celery.py 和 tasks.py
celery.py
其中 celery.py 內容為 celery 實例化以及一些基礎配置,文件內容如下:
from celery import Celery
app = Celery('proj',
broker='redis://localhost/0',
backend='redis://localhost/1',
include=['proj.tasks1', 'proj.tasks2'])
app.conf.update(
result_expires=60
)
if __name__ == '__main__':
app.start()
在這裡,我們還是對 celery 進行了實例化的操作,但是在這裡項目名稱改為了 proj,也就是這個文件的上一級文件夾名稱
broker、backend 還是對應的配置
但是因為對應的任務我們是單獨以文件的形式引入,所以,在這裡引入的方式是通過 include 的方式來實現的
app.conf.update() 是對 celery 配置的補充,這裡只加了一個參數,表示是對系統對結果的留存時間。
另外幾種配置方式我們放在下麵詳講。
接著 app.start() 就是項目的啟動。
tasks.py
在這裡我們將 task 作為兩部分拆解,分別放在兩個文件下,內容分別如下
#tasks1.py
from .celery import app
@app.task
def add(x, y):
return x + y
#tasks2.py
from .celery import app
@app.task
def mul(x, y):
return x * y
啟動服務,在 proj 所在的文件夾,執行下麵的命令:
celery -A proj worker -l INFO
運行延時任務
在 proj 同級的文件夾下執行 python3,進入 python 的交互界面:
from proj.tasks1 import add
add.delay(1, 2)
2、celery配置的幾種方式
在上面的 celery 的配置方式,是一部分寫在 celery 的實例化過程中,另一部分是通過 app.conf.update() 的方式寫入
這裡介紹一下,celery 的配置還可以通過類的方式來寫入,或者把所有變數都寫入一個文件,通過引入文件的形式來引入變數。
不管是以類的方式還是文件的形式都會使用到一個方法:config_from_object(),參數為需要引入的變數
類的方式載入配置
下麵是一個類的方式引入的示例:
# celery.py
from celery import Celery
app = Celery()
class Config:
include = ['proj.tasks1', 'proj.tasks2']
broker_url = 'redis://localhost:6379/0'
result_backend = 'redis://localhost:6379/1'
app.config_from_object(Config)
if __name__ == '__main__':
app.start()
這裡需要註意的是在 Config 中的 broker_url 和 result_backend 與直接實例化 Celery 時寫入的參數名稱是不一樣的
文件的形式載入配置
接下來我們在 proj 的文件夾中新建一個文件 celeryconfig.py,那麼 proj 文件夾下的文件配置則如下:
proj/__init__.py
/celery.py
/celeryconfig.py
/tasks1.py
/tasks2.py
配置文件內容:
# celeryconfig.py
broker_url = 'redis://localhost/0'
result_backend = 'redis://localhost/1'
include = ['proj.tasks1', 'proj.tasks2']
celery 文件內容:
# celery.py
from celery import Celery
from . import celeryconfig
app = Celery()
app.config_from_object(celeryconfig)
if __name__ == '__main__':
app.start()
無論是把配置寫入 Config 類中,還是寫入文件,這裡的思想都是將配置集中處理,在一處管理所有的配置內容。
註意:
在這裡我們引入配置的方式都是 config_from_object(),我們之前還介紹過一個更新配置的方式是 app.conf.update()
這裡要說明的是,只要運行了 config_from_object() 函數,在此之前的變數都會被覆蓋失效,如果我們要新增 celeryconfig 之外的配置,則需要在調用 config_from_object() 函數之後調用,比如:
app = Celery()
app.conf.update(result_expires=60) # 在 config_from_config() 之前調用,會失效
app.config_from_object(celeryconfig)
app.conf.update(result_expires=30) # 這個配置會生效
還有一種引入配置的方式是在 Django 系統中,將 Celery 相關的變數都寫入 settings.py,然後通過 namespace 的方式引入到 Celery 中進行實例化處理。
這個方式我們在介紹 celery 與 Django 結合的時候再做介紹。
3、一些基本配置
設置時區
比如我們設置北京時間:
app.conf.update(
enable_utc=False,
timezone='Asia/Shanghai',
)
broker 和 result_backend 設置
設置 broker 和 result_backend 的地址:
app.conf.update(
broker_url = 'redis://localhost:6379/0'
result_backend = 'redis://localhost:6379/1'
)
如果是 broker 和 backend 加密碼的配置,則是如下:
app.conf.update(
broker_url = 'redis://:123456@localhost:6380/0'
result_backend = 'redis://:123456@localhost:6380/1'
)
其中,123456 是密碼。
如果是用 docker 啟動一個帶密碼的 redis,命令如下:
docker run -d --name redis_pwd -p6380:6379 redis:latest --requirepass 123456
此外還有一些任務隊列 queue、預設隊列、任務路由配置、定時任務的設置,在後面介紹到的時候再一一介紹。
下一篇筆記將介紹 task 和 task 的調用。
如果想獲取更多後端相關文章,可掃碼關註閱讀: