背景介绍
最近的一个项目使用到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
这个参数,这时候就会报错了~~想知道咱们解吗?下次见~