背景介紹
最近的一個項目使用到celery
結算訂單,使用celery
的確很方便。但是復雜的內部框架導致了需要傳人大量的參數例如數據庫配置文件等。下面先來看看我仿照官網寫的代碼。所有代碼都放到github咯。
from celery import Celery
app = Celery('tasks',broker='redis://localhost:6379/0',backend='redis://localhost:6379/0')
@app.task
def add(x, y):
return x+y
假設這時候我實現了產品的要求,一個簡單的加法運算。
然而當真正部署到線上時,管理員非常不滿意的說你必須能夠走配置。
Celery配置
作為一個碼農我想過走配置,所以我就去找celery
的官網寫一個配置文件celeryconfig.py
當然名字任意。
BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
同樣可以通過下面的方式運行。
celery worker -A tasks --loglevel=INFO
獲取當前測試代碼可以執行git checkout v0.2
Celery程序中我們自己的配置
以為一切都可以了,高高興興的走到管理員面前。他說你這個配置是你python
的配置,我們不想也不會幫你寫這個配置文件的。請你注意配置的姿勢與我們的保持一致。啥意思,看完他們的supervisor
我知道了他們的口味。
celery worker -A tasks --loglevel=INFO -config=~/etc/myconfig.json
他們期望是這樣的姿勢,好吧我試試~然而celery
並不是那么好欺負的。
為了測試是否支持,我們先寫一個簡單的myconfig.json
配置,。
{
"redis_db":{
"db_foo":"redis://localhost:6379/0",
"db_bar":"redis://localhost:6379/0"
},
"mysql_db":{
"db_foo":"xxxx",
"db_bar":"yyyy"
}
}
然后找個地方打印我們終端傳人的參數,能否能被我們截獲
import sys
print 'args-->',sys.argv
BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
運行后我們可以得到下面的結果。
看起來很順利,這時候我們試試如下方式解析我們關心的參數。
import sys
print 'args-->',sys.argv
cere_param = [i for i in sys.argv if i.startswith('--config')][0]
value_param = cere_param.split('=')[1]
print 'value-->',value_param
BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
看看下面的運行結果。
好了,解析得到了配置文件,接下來就是讀取里面的配置了。
import sys
import json
print 'args-->',sys.argv
cere_param = [i for i in sys.argv if i.startswith('--config')][0]
value_param = cere_param.split('=')[1]
print 'value-->',value_param
db_url = ''
with open(value_param,'r') as fd:
global db_url
conf = json.load(fd)
db_url = conf.get('redis_db',{}).get('db_foo')
print 'db_url-->',db_url
BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
運行后我們得到如下結果。
看到結果,我們很開心。這時候可以把這個配置應用上了。這時候管理員就很樂意幫你部署你的應用了。
celery worker -A tasks --loglevel=INFO --config=myconfig.json
想查看當前的所有代碼可以執行git checkout v0.3
哦。
總結
當前只是把管理員這關過了,而現實的項目中有很多依賴。分發任務的地方也不總是通過python shell
來實現的(實時上生產環境不可能人工去派發任務)。而生產環境下生產者很有可能主目錄會被切換,切換后通過咱們的方式讀取配置時。很有可能別人根本不會傳人--config=xx
這個參數,這時候就會報錯了~~想知道咱們解嗎?下次見~