如何让celery接受定制的参数
2017-03-09 16:59
218 查看
背景介绍
最近的一个项目使用到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这个参数,这时候就会报错了~~想知道咱们解吗?下次见~
相关文章推荐
- HTML页面如何象asp一样接受参数
- winform运行时如何接受参数?(示例)
- 代理如何接受请求参数
- 如何定制支持用户自定义boot参数的基于debian os的live cd
- shell如何向python传递参数,shell如何接受python的返回值
- HTML页面如何象asp一样接受参数 选择自 qxg1123 的 Blog
- SpringMVC如何接受 js jquery ajax 的数组参数传值
- 如何在一个页面中动态放置多个Droppable来接受不同的Draggable?(accept参数的用法)
- 如何在一个页面中动态放置多个Droppable来接受不同的Draggable?(accept参数的用法)
- Springmvc+ajax如何通过ajax封装多个对象参数,controller接受多个对象参数
- 如何让xslt样式表接受参数
- 关于 王爽 汇编综合研究 研究实验五 函数如何接受不定量的参数 (偷工法)
- 由一个页面传参数到另一个模式窗体,如何接受值
- ajax传入中文参数 action 接受如何避免乱码
- 如何在一个页面中动态放置多个Droppable来接受不同的Draggable?(accept参数的用法)
- winform运行时如何接受参数?(示例)
- .net 如何接受传入参数
- 如何在一个页面中动态放置多个Droppable来接受不同的Draggable?(accept参数的用法)
- iframe中子页面如何接收父页面所接受的参数
- SpringMVC如何接受POST请求中的json参数