如何让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'

运行后我们可以得到下面的结果。

如何让celery接受定制的参数

看起来很顺利,这时候我们试试如下方式解析我们关心的参数。

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'

看看下面的运行结果。

如何让celery接受定制的参数

好了,解析得到了配置文件,接下来就是读取里面的配置了。

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接受定制的参数

看到结果,我们很开心。这时候可以把这个配置应用上了。这时候管理员就很乐意帮你部署你的应用了。

celery worker -A tasks --loglevel=INFO --config=myconfig.json

想查看当前的所有代码可以执行git checkout v0.3哦。

总结

当前只是把管理员这关过了,而现实的项目中有很多依赖。分发任务的地方也不总是通过python shell来实现的(实时上生产环境不可能人工去派发任务)。而生产环境下生产者很有可能主目录会被切换,切换后通过咱们的方式读取配置时。很有可能别人根本不会传人--config=xx这个参数,这时候就会报错了~~想知道咱们解吗?下次见~

上一篇:arrays.xml文件中添加drawable数组的问题


下一篇:# webpack 3 & React 的简单配置 。