如何让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这个参数,这时候就会报错了~~想知道咱们解吗?下次见~
如何让celery接受定制的参数的更多相关文章
- 解决Win10系统下 C# DateTime 出现星期几的问题 解决ASP.NET MVC 接受Request Playload参数问题
解决Win10系统下 C# DateTime 出现星期几的问题 昨天晚上写代码的时候偶然发现 DateTime 里出现了星期几,当时一阵凌乱,去网上百度没有详细解决办法,很多人说可以用用 ToStri ...
- 1. 处理静态资源 2. controller如何接受请求得参数 3. 如何把controller得数据保存到view. 4. 在controller如何完成重定向到指定路径 5. controller返回json数据
1. 1. 处理静态资源2. controller如何接受请求得参数3. 如何把controller得数据保存到view.4. 在controller如何完成重定向到指定路径5. controller ...
- WebApi(四)-Post接口请求失败或接受不到参数(解决方法)
post方式只能接受一个参数而且必须用FromBody特性标识,所以当没有使用FromBody特性标识的时候就会请求失败,如有添加添加了那访问接口时候参数应传对象不能是key:val的格式否则会接收到 ...
- 解决ASP.NET MVC 接受Request Payload参数问题
今天与跟前端小伙伴对接口,发现微信小程序的POST带参数传值HttpContent.Request[]接收不到参数. 拿小程序官网文档举例 wx.request({ url: 'Text/Text', ...
- Struts2(接受表单参数)请求数据自动封装和数据类型转换
Struts2请求数据自动封装: (1)实现原理:参数拦截器 (2)方式1:jsp表单数据填充到action中的属性: 普通的成员变量,必须给set,get可以不给的. 注意点,A ...
- Python 构造一个可接受任意数量参数的函数
为了能让一个函数接受任意数量的位置参数,可以使用一个* 参数 在这个例子中,rest 是由所有其他位置参数组成的元组.然后我们在代码中把它当成了一个序列来进行后续的计算
- js 函数作为参数+接受任意数量参数
javascript中的函数是“复合数据类型”,又成为“引用类型”.引用类型的变量指向存储单元中存放的是它们的实际存放地址.函数名是对函数的一种引用.var a=max_num ;a()就可以调用fu ...
- Spring MVC 接受的请求参数
目录 1. 概述 2. 详解 2.1 处理查询参数 2.2 处理路径参数接受输入 2.3 处理表单 3. 补充内容 3.1 Ajax/JSON 输入 3.2 multipart参数 3.3 接收 he ...
- Python基础之可接受任意数量参数的函数
1. 可接受任意数量位置参数的函数 为了能让一个函数接受任意数量的位置参数,可以在参数部分使用“*”. def avg(first, *rest): return (first + sum(rest) ...
随机推荐
- Angular - - ngIf、ngSwitch、ngHide/ngShow
在组合这些ng指令写到一篇文章里的时候,基本是有规则的,野兽把功能相似相近的一类大多会组合到一起,方便理解和记忆. 这篇的三个指令也都是对DOM元素的操作,页面上显示/隐藏的判断,添加/移除的判断. ...
- 《JAVA语言程序设计》上课笔记
教学目标:1.使学生了解JAVA课程的性质.定位.作用:为什么要学习JAVA?让学生知道如何学好JAVA: 教学内容: 一. 问几个问题 1. 你们到这里来干什么 ...
- Java 英语
Open quote,左括弧 associated with,关联
- PHP扩展之多线程
PHP一直以为不支持多线程,后面才知道有基于pThread的扩展包,地址如下: http://php.net/manual/zh/book.pthreads.php 我感兴趣的是以下几个点: 1.Th ...
- 使用 GitHub, Jekyll 打造自己的免费独立博客
使用 GitHub, Jekyll 打造自己的免费独立博客 GitHub是一个代码托管网站,现在很多开源项目都放在GitHub上. 利用GitHub,可以让全球各地的程序员们一起协作开发.GitHub ...
- java工程打包成jar包,并且解压lib里的jar包
在我们开发完java工程部署时,有时不需要web容器,为了方便部署有时候需要打成jar包. 这里介绍2种Eclipse打jar包的方式, 方式一.工程引用的jar包打在lib目录下 1.工程上右键,E ...
- .net判断System.Data.DataRow中是否包含某列
大家对将DataRow转成实体对象并不陌生,转成实体的时候一般都会加上这个判断 if (row["字段名"] != null && row["字段名&q ...
- “权限系统_基于HUI”的简单介绍和交流
昂,最近比较闲,写了个权限系统. 后端框架还是老样子,基于本人自己搭建的后台基础开发框架"Spring_Mvc_EF":前端框架,我挑选了一阵子,最后选用了HUI前端开发框架,因为 ...
- cygwin 运行窗口程序
首先, 默认安装的cygwin是不能运行窗口程序的 比如,一段python窗口程序: import * from tkinter Tk() mainloop() 如果使用命令行: python3 py ...
- 性能优化之数据存储&DOM编程
多读书多看报 数据存储 ·在javascript中,数据存储的位置会对代码整体性能产生重大的影响. ·数据存储共有4种方式:字面量.变量.数组.对象成员. ·要理解变量的访问速度,就要理解作用域. ...