如何讓celery接受定製的參數

背景介紹

最近的一個項目使用到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配置

做爲一個碼農我想過走配置,因此我就去找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.2redis

Celery程序中咱們本身的配置

覺得一切均可以了,高高興興的走到管理員面前。他說你這個配置是你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這個參數,這時候就會報錯了~~想知道我們解嗎?下次見~

相關文章
相關標籤/搜索