• 如何让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这个参数,这时候就会报错了~~想知道咱们解吗?下次见~

  • 相关阅读:
    装饰器模式(Decorator)
    原语:从0到1,从硬件指令集到OS原语,锁原语的哲学
    从Oop-Klass模型看透反射
    从三数之和看如何优化算法,递推-->递推加二分查找-->递推加滑尺
    单例模式-静态内部类实现及原理剖析
    单例模式-DCL双重锁检查实现及原理刨析
    二分查找java实现
    I/O管理杂记
    PCB WCF Web接口增减参数后,在客户端不更新的情况,是否影响客户端,评估测试
    PCB MS SQL 排序应用(row_number rank dense_rank NTILE PARTITION)
  • 原文地址:https://www.cnblogs.com/landpack/p/6523605.html
Copyright © 2020-2023  润新知