Celery的使用(2)---從配置開始

前言

上文中我們將配置直接設置在了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'}}

結束

以上就是配置相關的內容,更多資料請移步從今天開始種樹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章