最近的一個項目使用到celery
結算訂單,使用celery
的確很方便。可是複雜的內部框架致使了須要傳人大量的參數例如數據庫配置文件等。下面先來看看我仿照官網寫的代碼。全部代碼都放到github咯。python
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
假設這時候我實現了產品的要求,一個簡單的加法運算。
然而當真正部署到線上時,管理員很是不滿意的說你必須可以走配置。mysql
做爲一個碼農我想過走配置,因此我就去找celery
的官網寫一個配置文件celeryconfig.py
固然名字任意。git
BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
一樣能夠經過下面的方式運行。github
celery worker -A tasks --loglevel=INFO
獲取當前測試代碼能夠執行git checkout v0.2
redis
覺得一切均可以了,高高興興的走到管理員面前。他說你這個配置是你python
的配置,咱們不想也不會幫你寫這個配置文件的。請你注意配置的姿式與咱們的保持一致。啥意思,看完他們的supervisor
我知道了他們的口味。sql
celery worker -A tasks --loglevel=INFO -config=~/etc/myconfig.json
他們指望是這樣的姿式,好吧我試試~然而celery
並非那麼好欺負的。
爲了測試是否支持,咱們先寫一個簡單的myconfig.json
配置,。shell
{ "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'
運行後咱們能夠獲得下面的結果。json
看起來很順利,這時候咱們試試以下方式解析咱們關心的參數。app
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
這個參數,這時候就會報錯了~~想知道我們解嗎?下次見~