如何讓celery接受定制的參數


背景介紹

最近的一個項目使用到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這個參數,這時候就會報錯了~~想知道咱們解嗎?下次見~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM