背景介绍

最近的一个项目使用到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. Delphi基本图像处理方法汇总

    这篇文章主要介绍了Delphi基本图像处理方法,实例汇总了Delphi操作图像实现浮雕.反色.模糊.翻转等常用效果的方法,非常具有实用价值,需要的朋友可以参考下   本文实例汇总了Delphi基本图像 ...

  2. 部署statspack工具(一)

    禁用sga自动管理机制,分配比较小的数据缓冲区(30m)和共享池(70m)空间 1.1关闭SGA自动管理机制 查看是否开启了ASSM idle>show parameter sga; NAME  ...

  3. jQuery获取、设置title的值

    获取值:var t = $(document).attr('title'); 设置值:$(document).attr('title','value');

  4. JS-鼠标滚轮事件 和 阻止默认行为

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. 让EFCore更疯狂些的扩展类库(二):查询缓存、分部sql、表名替换的策略配置

    前言 上一篇介绍了扩展类库的功能简介,通过json文件配置sql语句 和 sql语句的直接执行,这篇开始说明sql配置的策略模块:策略管理器与各种策略的配置. 类库源码:github:https:// ...

  6. gunicorn 简介

      gunicorn是一个python Wsgi http server,只支持在Unix系统上运行,来源于Ruby的unicorn项目.Gunicorn使用prefork master-worker ...

  7. CodeForces757A

    A. Gotta Catch Em' All! time limit per test 1 second memory limit per test 256 megabytes input stand ...

  8. Linux 用键盘操作窗口

    以下是我从各处搜集来的关于用键盘操作窗口信息,操作可能不是最简或者最好的,当然也可能不是最全的,以后遇到新的操作,我会即使添加,如果你有我没有列出的操作,希望你能提出,我可以加上! 我实验的操作系统是 ...

  9. jq操作img大小(动态修改)

    今天适配app页面是约到一个问题 当我们要显示后台传过来若干个尺寸不一的图片时,为了保证图片大小的一致性及比例的协调,需要动态改变图片显示尺寸. 通过搜索,我们可以从网上找到实现此功能的jQuery代 ...

  10. 【LeetCode题解】数组Array

    1. 数组 直观地看,数组(Array)为一个二元组<index, value>的集合--对于每一个index,都有一个value与之对应.C语言中,以"连续的存储单元" ...