背景介绍

最近的一个项目使用到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接受定制的参数的更多相关文章

  1. 解决Win10系统下 C# DateTime 出现星期几的问题 解决ASP.NET MVC 接受Request Playload参数问题

    解决Win10系统下 C# DateTime 出现星期几的问题 昨天晚上写代码的时候偶然发现 DateTime 里出现了星期几,当时一阵凌乱,去网上百度没有详细解决办法,很多人说可以用用 ToStri ...

  2. 1. 处理静态资源 2. controller如何接受请求得参数 3. 如何把controller得数据保存到view. 4. 在controller如何完成重定向到指定路径 5. controller返回json数据

    1. 1. 处理静态资源2. controller如何接受请求得参数3. 如何把controller得数据保存到view.4. 在controller如何完成重定向到指定路径5. controller ...

  3. WebApi(四)-Post接口请求失败或接受不到参数(解决方法)

    post方式只能接受一个参数而且必须用FromBody特性标识,所以当没有使用FromBody特性标识的时候就会请求失败,如有添加添加了那访问接口时候参数应传对象不能是key:val的格式否则会接收到 ...

  4. 解决ASP.NET MVC 接受Request Payload参数问题

    今天与跟前端小伙伴对接口,发现微信小程序的POST带参数传值HttpContent.Request[]接收不到参数. 拿小程序官网文档举例 wx.request({ url: 'Text/Text', ...

  5. Struts2(接受表单参数)请求数据自动封装和数据类型转换

    Struts2请求数据自动封装: (1)实现原理:参数拦截器 (2)方式1:jsp表单数据填充到action中的属性:        普通的成员变量,必须给set,get可以不给的.    注意点,A ...

  6. Python 构造一个可接受任意数量参数的函数

    为了能让一个函数接受任意数量的位置参数,可以使用一个* 参数 在这个例子中,rest 是由所有其他位置参数组成的元组.然后我们在代码中把它当成了一个序列来进行后续的计算

  7. js 函数作为参数+接受任意数量参数

    javascript中的函数是“复合数据类型”,又成为“引用类型”.引用类型的变量指向存储单元中存放的是它们的实际存放地址.函数名是对函数的一种引用.var a=max_num ;a()就可以调用fu ...

  8. Spring MVC 接受的请求参数

    目录 1. 概述 2. 详解 2.1 处理查询参数 2.2 处理路径参数接受输入 2.3 处理表单 3. 补充内容 3.1 Ajax/JSON 输入 3.2 multipart参数 3.3 接收 he ...

  9. Python基础之可接受任意数量参数的函数

    1. 可接受任意数量位置参数的函数 为了能让一个函数接受任意数量的位置参数,可以在参数部分使用“*”. def avg(first, *rest): return (first + sum(rest) ...

随机推荐

  1. 【翻译】在Visual Studio中使用Asp.Net Core MVC创建第一个Web Api应用(二)

    运行应用 In Visual Studio, press CTRL+F5 to launch the app. Visual Studio launches a browser and navigat ...

  2. 按钮(Buton)组价的功能和用法

    Button继承了TextView,它主要是在UI界面上生成一个按钮,该按钮可以供用户单机,当用户单击按钮时,按钮会触发一个onClick事件. 按钮使用起来比较容易,可以通过为按钮指定android ...

  3. xhtmlrenderer渲染pdf,中文换行

    在实际开发中,发现在table中显示中文,渲染出来的pdf,中文内容不自动换行.经过搜索发现了一种解决方案,如下: 重写Breaker,修改right计算方式 /* * Breaker.java * ...

  4. 使用AngularJS的三个重要原因

    入门教程:http://www.ituring.com.cn/minibook/303 : http://angularjs.cn/tag/AngularJS 原因一:Google开发的框架 要知道开 ...

  5. [PCB设计] 4、BAT脚本处理AD生成的GERBER文件为生产文件

    1.生产资料概述 为了资料保密和传输方便,交给PCB厂商打样的资料一般以Gerber和钻孔文件为主,换句话说,只要有前面说的两种文件,就能制作出你想要的PCB了. 一般来说,交给PCB厂商的Gerbe ...

  6. java Runtime类

    public class Test { public static void main(String[] args) throws UnsupportedEncodingException { Run ...

  7. 基于Ubuntu 14.04构建tomcat7镜像

    1.创建Dockerfile文件(如果在Windows下编辑文件,一定要将格式转化为Linux格式文件,否则将导致Linux下查看文件每行多一个^M) # Pull base image FROM u ...

  8. 关于flash擦除的方法

    一般的Flash,只允许写时将1变成0,而不允许0变成1:仅当擦除时将0变成1.所以写全0xff是没什么意义的 以前对flash只能进行一次写很困惑,这句话解释了原因. norflash就是 对bit ...

  9. Mybatis拦截器实现分页

    本文介绍使用Mybatis拦截器,实现分页:并且在dao层,直接返回自定义的分页对象. 最终dao层结果: public interface ModelMapper { Page<Model&g ...

  10. C#进阶系列——使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)

    前言:上篇C#进阶系列——使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)介绍了下使用Advanced Installer配置IIS和Web.confi ...