前言
上文中我們將配置直接設置在了tasks.py中:
tasks.py
from celery import Celery
app = Celery('tasks', broker='redis://:password@host:port/database_num',backend='redis://:password@host:port/database_num')
#第一個次數‘tasks’是當前模塊的名字,第二個參數是broker代理的url,這裏選用了redis
這樣的做法適合於小項目,如果想規範化的話還是建議單獨存放在一個配置文件中。
開始配置
配置文件化的好處是容易管理,可以增加複用率,不然每個tasks.py文件中你都寫一遍冗長的redis、MQ的url,一方面麻煩,另一方面容易泄露一些敏感字段。
配置文件化
這時我們可以在與tasks.py 同級的目錄下新建一個celeryconfig.py的文件,文件名並不是指定的,可以任意取,但是最好能一眼就能看出它的功能。
打開celeryconfig.py,我們開始將tasks.py中的broker和backend信息搬到配置文件中,接下介紹一下用到的兩個配置,有些配置celery4.x和老版本有一些區別,有區別的在後面已註釋:
broker的url
CELERY_BROKER_URL='redis://:password@host:port/database_num' ##4.x之前用這個
BROKER_URL = 'redis://:password@host:port/database_num' ##4.x之後用這個
接受結果的url
CELERY_RESULT_BACKEND = 'redis://:password@host:port/database_num'
此時,celeryconfig.py文件內容如下:
CELERY_BROKER_URL='redis://:password@host:port/database_num'
CELERY_RESULT_BACKEND = 'redis://:password@host:port/database_num'
相應的我們將tasks.py中的內容也做一些調整:
from celery import Celery
app = Celery("tasks")
app.config_from_object('celeryconfig', namespace='CELERY')
可以看出,配置信息已經沒有在task.py中出現,內容已減少,看着沒那麼亂了,創建celery實例也只用傳遞一個參數,與此同時,我們引入了一個新的函數:
app.config_from_object(self, obj,silent=False, force=False, namespace=None)
#obj:即爲我們配置文件或者是一個帶有配置的對象;
#silent:爲True時導入發生錯誤會被忽略;
#force:爲True時回強制立刻讀取配置文件,默認只有需要的時候回被調用;
#namespace:命名;
這個函數可以使我們很容易的就讀取配置文件。配置文件所在目錄不同導入方式也可以不同:
app.config_from_object('func_app.celeryconfig')
#func_app爲celeryconfig所在目錄名稱
這種情況適用於tasks.py與不在一個目錄下,如果都在一個目錄下則直接引入即可,不必加前面的func_app,還有一種方式:
##這裏假設celeryconfig 在func_app 下且tasks.py不在func_app 下。
from func_app import celeryconfig
app.config_from_object(celeryconfig)
需要注意的是,調用config_from_object函數將重置前面的所有配置,你如果想添加額外的設置則需要在這個函數調用後添加。
前面說到config_from_object中的obj可以爲配置對象,這裏舉一個小例,如果你確實需要這麼做那麼這個例子可以作爲一個參考:
from celery import Celery
app = Celery("tasks")
class Config:
enable_utc = True#啓動時區
timezone = 'Europe/London' #設置時區
app.config_from_object(Config)#Config爲類,上面我們用的是配置文件,這裏使用類
從環境變量中讀取配置
還可以從環境變量中讀取配置,這裏使用到了下面這個函數:
app.config_from_envvar()
import os
from celery import Celery
#: Set default configuration module name
os.environ.setdefault('CELERY_CONFIG_MODULE', 'celeryconfig')
app = Celery()
app.config_from_envvar('CELERY_CONFIG_MODULE')
作爲一個瞭解吧,很少會用到這種方式,大多數應該還是採用了文件或者類的方式。
檢查配置
如果你想把配置打印出來作爲調試信息,同時還希望能屏蔽一些敏感的信息,可以使用Celery提供的這幾個API:
humanize()函數:
app.conf.humanize(with_defaults=False, censored=True)
這個方法默認情況下只會以字符串返回你配置的內容,但是你可以通過設置with_defaults來返回所有默認配置,以下是執行後返回的內容。
>>>app.conf.humanize(with_defaults=False, censored=True)
CELERY_BROKER_URL: 'redis://:********@127.0.0.1:6379/1'
CELERY_RESULT_BACKEND: 'redis://:********@127.0.0.1:6379/2'
可以看出它把用戶名和密碼字段加密了。
如果想以字典形式返回配置信息請使用:
table()函數
>>>app.conf.table(with_defaults=False, censored=True)
{'CELERY_BROKER_URL': 'redis://:********@127.0.0.1:6379/1', 'CELERY_RESULT_BACKEND': 'redis://:********@127.0.0.1:6379/2'}
注意,celery並不能屏蔽所有敏感字段,它也只是依照規則使用正則表達式進行識別,如果你想爲你的一些自定義特殊字段進行加密,應該使用celery規定的命名方式,如果你自定義配置裏包含這些字符串則會被加密:
API, TOKEN, KEY, SECRET, PASS, SIGNATURE, DATABASE
其他常用配置
併發的worker數量,也是命令行-c指定的數目
事實上並不是worker數量越多越好,保證任務不堆積,加上一些新增任務的預留就可以了
CELERYD_CONCURRENCY = 20
celery worker每次去redis取任務的數量,默認值就是4
CELERYD_PREFETCH_MULTIPLIER = 4
每個worker執行了多少次任務後就會死掉,建議數量大一些
CELERYD_MAX_TASKS_PER_CHILD = 200
celery任務執行結果的超時時間
CELERY_TASK_RESULT_EXPIRES = 1200
單個任務的運行時間限制,否則會被殺死
CELERYD_TASK_TIME_LIMIT = 60
使用redis存儲任務執行結果,默認不使用
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
將任務結果使用’pickle’序列化成’json’格式
任務序列化方式
CELERY_TASK_SERIALIZER = 'pickle'
任務執行結果序列化方式
CELERY_RESULT_SERIALIZER = 'json'
也可以直接在Celery對象中設置序列化方式
app = Celery('tasks', broker='...', task_serializer='yaml')
指定任務序列化方式
CELERY_TASK_SERIALIZER = 'msgpack'
指定結果序列化方式
CELERY_RESULT_SERIALIZER = 'msgpack'
指定任務接受的序列化類型.
CELERY_ACCEPT_CONTENT = ['msgpack']
任務過期時間,celery任務執行結果的超時時間
CELERY_TASK_RESULT_EXPIRES = 24 * 60 * 60
任務發送完成是否需要確認,對性能會稍有影響
CELERY_ACKS_LATE = True
壓縮方案選擇,可以是zlib, bzip2,默認是發送沒有壓縮的數據
CELERY_MESSAGE_COMPRESSION = 'zlib'
規定完成任務的時間
在5s內完成任務,否則執行該任務的worker將被殺死,任務移交給父進程
CELERYD_TASK_TIME_LIMIT = 5
celery worker的併發數,默認是服務器的內核數目,也是命令行-c參數指定的數目
CELERYD_CONCURRENCY = 4
celery worker 每次去BROKER中預取任務的數量
CELERYD_PREFETCH_MULTIPLIER = 4
每個worker執行了多少任務就會死掉,默認是無限的
CELERYD_MAX_TASKS_PER_CHILD = 40
設置默認的隊列名稱,如果一個消息不符合其他的隊列就會放在默認隊列裏面,如果什麼都不設置的話,數據都會發送到默認的隊列中
CELERY_DEFAULT_QUEUE = "default"
設置時區
CELERY_TIMEZONE = 'Asia/Shanghai'
啓動時區設置
CELERY_ENABLE_UTC = True
限制任務的執行頻率
下面這個就是限制tasks模塊下的add函數,每秒鐘只能執行10次
CELERY_ANNOTATIONS = {'tasks.add':{'rate_limit':'10/s'}}
或者限制所有的任務的刷新頻率
CELERY_ANNOTATIONS = {'*':{'rate_limit':'10/s'}}
結束
以上就是配置相關的內容,更多資料請移步從今天開始種樹。